2011-05-13 67 views
1

如何在不指定uri/url/baseaddress的情況下使用WCF?無論如何要讓它自動獲得這些東西?在不指定uri的情況下使用WCF

我的意思是我希望使它像asp.net網站和webservices一樣工作,我們不提及uri和東西,只要我們在IIS中正確配置它就會自行處理它。 我需要WCF上的類似解決方案。

請幫忙...

謝謝。

編輯: 下面是一個使用此定製ServiceHostFactory我的服務器端code.I'm ...

protected override System.ServiceModel.ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses) 
    { 

     BasicHttpBinding basichttpbinding = new BasicHttpBinding(BasicHttpSecurityMode.None); 

     basichttpbinding.CloseTimeout=TimeSpan.MaxValue; 
     basichttpbinding.OpenTimeout=TimeSpan.MaxValue; 
     basichttpbinding.ReceiveTimeout=TimeSpan.MaxValue; 
     basichttpbinding.SendTimeout=TimeSpan.MaxValue; 
     // basichttpbinding.TransferMode = TransferMode.Buffered; 

     ServiceEndpoint servicepoint=new ServiceEndpoint(ContractDescription.GetContract(serviceType)); 
     servicepoint.Binding=basichttpbinding; 

     ServiceHost servicehost = new ServiceHost(serviceType, baseAddresses); 

     ((ServiceDebugBehavior)servicehost.Description.Behaviors[typeof(ServiceDebugBehavior)]).IncludeExceptionDetailInFaults=true; 

     servicehost.OpenTimeout = TimeSpan.MaxValue; 
     servicehost.CloseTimeout = TimeSpan.MaxValue; 
     servicepoint.Binding.SendTimeout = TimeSpan.MaxValue; 
     servicepoint.Binding.ReceiveTimeout = TimeSpan.MaxValue; 
     basichttpbinding.MaxBufferPoolSize = 999999999; 
     // basichttpbinding.MaxConnections = 999999999; 
     //basichttpbinding.MaxConnections = 999999999; 
     basichttpbinding.MaxReceivedMessageSize = 999999999; 
     XmlDictionaryReaderQuotas quotas = new XmlDictionaryReaderQuotas(); 
     quotas.MaxArrayLength = 999999999; 
     quotas.MaxBytesPerRead = 999999999; 
     quotas.MaxDepth = 999999999; 
     quotas.MaxNameTableCharCount = 999999999; 
     quotas.MaxStringContentLength = 999999999; 
     basichttpbinding.ReaderQuotas = quotas; 

     //foreach (Uri uri in baseAddresses) 
     //{ 

     servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "http://localhost:52855/WCFService1/Service.svc"); 

     // } 

     return servicehost; 
    } 
+1

你可以更具體一點。 「我如何使用WCF」和「工作列表asp.net網站」的含義是什麼? –

+0

特別是沒有指定URI。我需要使用而不指定uri/baseaddress並使其自動獲取它們。 – Josh

回答

3

(假設你的目標IIS ...)

按照Deploying an Internet Information Services-Hosted WCF Service文檔:

...在IIS託管服務 沒有控制自己的基地址的能力 ; IIS託管服務的基地址 是其.svc文件的地址。

您的自定義服務主機邏輯可能已停止此行爲工作嗎?

更新: 根據功能文檔,您可以將相對地址傳遞給AddServiceEndpoint調用。嘗試空字符串或「/」。

+0

我只是指定了endpointaddress而不是基地址。我希望我不必指定任何地址。如果我編譯代碼而不使用任何地址,它編譯的不錯,但在運行時拋出一個錯誤,要求輸入一個端點地址。 – Josh

+0

我不確定你是否正確閱讀我的答案。 WCF文檔聲稱基地址是自動提供的,並且是「.svc文件的地址」...因此在您的示例中應該是http:// localhost:52855/WCFService1/Service.svc – Schneider

+0

好的,我可以看到您正在傳遞基地址....在這種情況下,您不需要爲端點提供絕對地址,只需傳遞一個相對地址即可 – Schneider

2

看一看WCF Discovery它允許你動態發現端點。

+0

WCF發現不讓我留在沒有在服務器端指定uri。這是爲了客戶找到服務器。我不介意爲客戶提供uri。我的問題是服務器。爲什麼服務器需要知道它託管的位置?我希望它自動找到它......謝謝.. – Josh

+1

它不。向我顯示在指定URL的服務器端代碼中的位置。 –

+0

我發佈了我的代碼。告訴我如何更改此代碼,以便我不必指定任何網址。謝謝。 – Josh

2

我認爲,所有你需要做的,你的代碼是這樣的:

servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, ""); 

來完成你想要的東西。正如@Schneider指出的那樣,IIS控制服務地址的分配。端點地址將始終相對於IIS分配地址。所以基於IIS端點的唯一有效值就像這樣:

servicehost.AddServiceEndpoint(typeof(IService), basichttpbinding, "MyService"); 

這會將MyService附加到服務URL。

0

我有一個類似的問題 - 這是固定的,對我來說:

添加到您的界面的頂部:

[ServiceContract(Namespace = "your namespace here")] 

在你的app.config,請確保您的服務名稱該部分的形式是Namespace.Class

希望這會有所幫助。

相關問題