2011-08-04 58 views
23

所以我很困惑什麼服務端點和主機基地址。在我到目前爲止所走過的所有例子中,他們都討論瞭如何使用所需的綁定來設置端點,並且您通常可以導航到這些端點WCF服務端點vs主機基地址

Hoever當我使用以下配置來設置和託管我的服務時,公開主機基地址。

<configuration> 
     <system.web> 
     <compilation debug="true" /> 
     </system.web> 
     <!-- When deploying the service library project, the content of the config file must be added to the host's 
     app.config file. System.Configuration does not support config files for libraries. --> 
     <system.serviceModel> 
     <services> 
      <service name="HostService.EvalService"> 
      <endpoint address="http://localhost:8080/basic" 
       binding="basicHttpBinding" contract="HostService.IEvalService" /> 
      <endpoint address="http://localhost:8080/ws" 
       binding="wsHttpBinding" contract="HostService.IEvalService" /> 
      <endpoint address="mex" binding="mexHttpBinding" 
       name="mex" contract="IMetadataExchange" /> 
      <host> 
       <baseAddresses> 
       <add baseAddress="http://localhost:8080/EvalsService" /> 
       </baseAddresses> 
      </host> 
      </service> 
     </services> 
     <behaviors> 
      <serviceBehaviors> 
      <behavior name=""> 
       <serviceMetadata httpGetEnabled="true" /> 
       <serviceDebug includeExceptionDetailInFaults="false" /> 
      </behavior> 
      </serviceBehaviors> 
     </behaviors> 
     </system.serviceModel> 
    </configuration> 

有人可以向我解釋這個嗎?

回答

32

當您在IIS上託管WCF服務時,基地址只能是.svc文件的URL。如果您指定了任何其他基地址,則會被忽略。您仍然可以爲您的端點指定相對URI,例如address="basic"address = "ws"。然後在這種情況下端點上的地址變爲<URL to the .svc file>/basic<URL to the .svc file>/ws

+0

我應該還是能夠導航到端點?目前我不能 –

+4

您將無法導航到瀏覽器中的端點,但端點仍處於活動狀態,客戶端應該能夠正常連接。 –

+12

我不知道爲什麼MS沒有在他們的怪異文檔中陳述你的一些子彈。 – PositiveGuy

6

當您使用基地址時,您不需要爲您的端點提供絕對URI,例如,您可以在端點配置部分使用address="basic",這意味着該端點的地址爲http://localhost:8080/EvalsService/basic

+0

是否可以通過代碼設置端點的相對地址? – FrenkyB

15

當您將端點地址留空時,這意味着端點將簡單地使用相應的基地址作爲其端點地址。或者,您可以將基地址配置爲服務的絕對路徑,或者作爲更好的方法,爲您的端點寫入相對地址。

當您在IIS上託管服務時,服務基地址由IIS虛擬目錄以及.svc文件確定。

假設您有一個名爲calc.svc的文件,並將其放置在對應於'http:// localhost:8080/calcservice'的虛擬目錄中。該服務的基地址爲'http:// localhost:8080/calcservice/calc.svc'。

IIS強制您的端點使用根據您的服務部署路徑確定的此基地址。 如果你指定了不同的基地址,那麼相應的虛擬目錄,你會得到一個異常。

考慮下面的配置;

<configuration> 
    <system.serviceModel> 
     <services> 
      <service name="CalculatorService"> 
       <!-- base address determined by IIS virtual directory --> 
       <endpoint binding="basicHttpBinding" contract="ISimpleMath"/> 
       <endpoint address="secure" binding="wsHttpBinding" contract="ISimpleMath"/> 
       <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/> 
      </service> 
     ... 

...第一端點的地址變爲相同的基地址(的 'http://本地主機:8080/calcservice/calc.svc')自從離開端點地址空。第二個端點的地址變成了附加「安全」的基地址的組合,如下所示:'http:// localhost:8080/calcservice/calc.svc/secure'。並且「mex」端點的地址是「http:// localhost:8080/calcservice/calc.svc/mex」。這對於某些人來說似乎有點奇怪,因爲地址的相對部分被添加到文件名的右側,但是您必須記住calc.svc是基地址的一部分,因此它必須以這種方式工作。

雖然你無法導航的「../mex」或通過瀏覽器「../secure」的網址,其實都是積極和客戶端可以消耗這些地址。

客戶行爲

客戶沒有服務的基址的認識,有沒有必要來支持他們對導線的側面類似的東西。因此,在客戶端對象模型或配置部分中找不到與基址相關的任何內容。客戶只需選擇一個特定的端點,該端點始終配置有絕對地址,並且該絕對地址決定了在傳輸過程中將使用的地址。

以上信息大部分來自Aaron Skonnard在msdn上的優秀article。我強烈建議您閱讀它以獲取WCF尋址背後的基礎知識。