WCF 服务基地址与端点地址

Posted

技术标签:

【中文标题】WCF 服务基地址与端点地址【英文标题】:WCF Service Base Address vs endpoint address 【发布时间】:2013-09-14 06:35:39 【问题描述】:

以下两种情况有什么区别:

配置 1:

<service name="WcfService1.Service1" behaviorConfiguration="MyServiceTypeBehaviors">
    <host>
        <baseAddresses>
            <add baseAddress="net.tcp://127.0.0.1:808/" />
        </baseAddresses>
    </host>
    <endpoint address="service"
              binding="netTcpBinding" 
              bindingConfiguration="MainBinding" 
              bindingName="MainBinding" 
              name="DefaultEndpoint" 
              contract="WcfService1.IService1" />
    <endpoint address="mex" 
              binding="mexTcpBinding" 
              contract="IMetadataExchange" />
</service>

配置 2:

<service name="WcfService1.Service1" behaviorConfiguration="MyServiceTypeBehaviors">
    <host>
        <baseAddresses>
            <add baseAddress="net.tcp://127.0.0.1:808/service" />
        </baseAddresses>
    </host>
    <endpoint address="net.tcp://127.0.0.1:808/service" 
              binding="netTcpBinding" 
              bindingConfiguration="MainBinding" 
              bindingName="MainBinding" 
              name="DefaultEndpoint" 
              contract="WcfService1.IService1" />
    <endpoint address="mex" 
              binding="mexTcpBinding" 
              contract="IMetadataExchange" />
  </service>

我的理解是,在任何一种情况下,基地址 + 端点地址都会解析为相同的绝对地址

但为什么我在 配置 2 上收到错误:“没有端点正在监听 net.tcp://127.0.0.1:808/ 但是配置1 运行服务没有任何错误!!!

编辑 1:

工作配置:

<host>
    <baseAddresses>
        <add baseAddress="net.tcp://127.0.0.1:808/" />
    </baseAddresses>
</host>
<endpoint address="service"
          binding="netTcpBinding" 
          bindingConfiguration="MainBinding" 
          bindingName="MainBinding" 
          name="DefaultEndpoint" 
          contract="WcfService1.IService1" />

非工作配置:

<host>
    <!--
    <baseAddresses>
        <add baseAddress="" />
    </baseAddresses>
    -->
 </host>
 <endpoint address="net.tcp://127.0.0.1:808/service"
           binding="netTcpBinding" 
           bindingConfiguration="MainBinding" 
           bindingName="MainBinding" 
           name="DefaultEndpoint" 
           contract="WcfService1.IService1" />
 <endpoint address="mex" 
           binding="mexTcpBinding" 
           contract="IMetadataExchange" />

在这种情况下,我删除了基地址并提供了完整的服务地址(没有 .svc 路径),但收到了套接字超时错误。在这种情况下有什么问题?未定义基地址时,端点地址是否总是需要带有 .svc 的完整地址?如果是这样,背后的原因可能是什么?

【问题讨论】:

尝试删除配置2中的主机元素 @sine,我没有收到任何错误,只是想了解我为什么会出现这种行为。 如何托管此 WCF 服务?如果您使用 IIS 来托管它,那么您的基地址实际上就是您的 *.svc 文件的位置,而您在此配置中拥有的任何内容都没有实际意义 @marc_s 是的,我在 IIS 上托管了我的服务 【参考方案1】:

baseAddress 就是端点的基地址(除非明确指定)。所以每个&lt;endpoint&gt; 都会继承自&lt;baseAddress&gt;(这就是为什么它们通常是"""mex")。例如

<host>
   <baseAddresses>
     <add baseAddress="http://127.0.0.1:1337/" />
   </baseAddresses>
</host>
...
<endpoint address="" contract="MyService.IMyContract" ... />
<endpoint address="mex" contract="IMetadataExchange" ... />

您现在有两个端点:

http://127.0.0.1:1337/ - 服务端点 http://127.0.0.1:1337/mex - 元数据端点

通过免除&lt;baseAddress&gt;,您要求&lt;endpoints&gt; 都完全合格(包括mex(不是))。例如

<host>
   <baseAddresses/>
</host>
...
<endpoint address="net.tcp://127.0.0.1:1337/" contract="MyService.IMyContract" ... />
<endpoint address="http://127.0.0.1:1337/mex" contract="IMetadataExchange" ... />

您现在有两个不同的端点:

net.tcp://127.0.0.1:1337/ - 服务端点 http://127.0.0.1:1337/mex - 元数据端点

【讨论】:

谢谢,在我的问题中,在配置 1 和 2 中,如果我们附加基地址和端点地址,最终的 URI 将类似于 net.tcp://127.0.0.1:808/服务。我说得对吗?或者,基地址是否会像这样:net.tcp://127.0.0.1:808/service/net.tcp://127.0.0.1:808/service(附加两次) 只有在指定绝对 uri 时才会忽略 baseAddress(因此,net.tcp://http:// 等将是完全限定的 uri)。否则,它基本上附加到 baseAddress (这意味着您的 mex,在您的第二个示例中,变为 net.tcp://127.0.0.1:808/service/mex,但服务仍然是 net.tcp://127.0.0.1:808/service 布拉德,编辑了问题。只是困惑,我对 wcf 的期望在哪里错了。如果你可以看看这个,请

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

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

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

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

wcf 端点相对地址

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

WCF 错误:相对端点地址