WCF服务基地址与端点地址

Sim*_*ons 5 .net c# configuration wcf

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

配置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>
Run Code Online (Sandbox Code Playgroud)

配置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>
Run Code Online (Sandbox Code Playgroud)

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

但是为什么我在配置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" />
Run Code Online (Sandbox Code Playgroud)

非工作配置:

<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" />
Run Code Online (Sandbox Code Playgroud)

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

Bra*_*tie 15

baseAddress只是,你的端点的基地址(除非明确指定).所以每次<endpoint>都会继承<baseAddress>(这就是为什么它们通常是"""mex").例如

<baseAddresses>
  <add baseAddress="http://127.0.0.1:1337/" />
</baseaddresses>
...
<endpoint address="" contract="MyService.IMyContract" ... />
<endpoint address="mex" contract="IMetadataExchange" ... />
Run Code Online (Sandbox Code Playgroud)

您现在有两个端点:

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

通过豁免<baseAddress>你要求<endpoints>两者都是完全合格的(包括mex(不是)).例如

<baseAddresses></baseaddresses>
...
<endpoint address="net.tcp://127.0.0.1:1337/" contract="MyService.IMyContract" ... />
<endpoint address="http://127.0.0.1:1337/mex" contract="IMetadataExchange" ... />
Run Code Online (Sandbox Code Playgroud)

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

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