WCF 服务基址与终结点地址
本文关键字:结点 地址 服务 WCF | 更新日期: 2023-09-27 18:30:52
以下两种情况有什么区别:
配置 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 的完整地址?如果是这样,背后的原因可能是什么?
baseAddress
就是端点的基址(除非明确指定)。所以每个<endpoint>
都会继承自<baseAddress>
(这就是为什么它们通常是""
和"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
- 元数据终结点
通过免除<baseAddress>
,您要求<endpoints>
都完全合格(包括 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
- 元数据终结点