2011-08-04 55 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寻址背后的基础知识。