WCF 服务端点与主机基地址

Posted

技术标签:

【中文标题】WCF 服务端点与主机基地址【英文标题】:WCF Service Endpoints vs Host Base address 【发布时间】:2011-10-19 18:04:18 【问题描述】:

所以我对服务端点和主机基地址的用途有点困惑。到目前为止,在我浏览过的所有示例中,他们都在讨论使用所需绑定设置端点,您通常可以导航到这些端点

但是,当我使用以下配置来设置和托管我的服务时,它似乎只公开了主机基地址。

    <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>

谁能给我解释一下?

【问题讨论】:

【参考方案1】:

当你使用基地址时,你不需要为你的端点提供绝对URI,例如,你可以在端点配置部分使用address="basic",这意味着该端点的地址是http://localhost:8080/EvalsService/basic

【讨论】:

是否可以通过代码设置端点的相对地址?【参考方案2】:

在 IIS 上托管 WCF 服务时,基地址只能是 .svc 文件的 URL。如果您指定任何其他基地址,它将被忽略。您仍然可以为端点指定相对 URI,例如 address="basic"address = "ws"。那么在这种情况下端点上的地址就变成了&lt;URL to the .svc file&gt;/basic&lt;URL to the .svc file&gt;/ws

【讨论】:

我还能导航到端点吗?目前我不能 您将无法在浏览器中导航到端点,但端点仍处于活动状态,客户端应该能够正常连接。 我不知道为什么 MS 没有在他们的怪异文档中说明你的一些子弹。【参考方案3】:

当您将端点地址留空时,这意味着端点将简单地使用相应的基地址作为其端点地址。或者,您可以将基地址配置为服务的绝对路径,或者作为更好的方法,为您的端点编写相对地址。

当您在 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://localhost:8080/calcservice/calc.svc')相同,因为我将端点地址留空。第二个端点的地址变成了基地址加上“secure”的组合,像这样:'http://localhost:8080/calcservice/calc.svc/secure'。 “mex”端点的地址是“http://localhost:8080/calcservice/calc.svc/mex”。这对某些人来说可能有点奇怪,因为地址的相对部分被添加到文件名的右侧,但你必须记住 calc.svc 是基地址的一部分,所以它必须以这种方式工作。

虽然您无法通过浏览器导航到“../mex”或“../secure”网址,但它们实际上是活动的,客户端可以使用这些地址。

客户行为

客户端不知道服务的基地址,也不需要在他们的网络上支持类似的东西。因此,您不会在客户端对象模型或配置部分中找到与基地址相关的任何内容。客户端只需选择一个特定的端点,该端点总是配置有一个绝对地址,该绝对地址决定了它将在传输过程中使用的地址。

以上信息主要来自 Aaron Skonnard 在 msdn 上的出色 article。我强烈建议您阅读它以了解 WCF 寻址背后的基础知识。

【讨论】:

以上是关于WCF 服务端点与主机基地址的主要内容,如果未能解决你的问题,请参考以下文章

WCF 异常:找不到与端点的方案 http 匹配的基地址

WCF Web 服务未部署在 localhost ... web.config ... 端点上

WCF 错误“找不到与具有绑定 NetTcpBinding 的端点的方案 net.tcp 匹配的基地址”

WCF 在运行时更改端点地址

wcf 端点相对地址

天蓝色服务结构 wcf 端点地址 net.tcp 而不是 http