暴露 net.tcp 终结点

9

我有些困惑如何在WCF中公开终端点。

我有一个TCP终端点和一个Mex TCP终端点。

<service name="MessageReaderService.MessageReaderService">
    <endpoint name="NetTcpReaderService" 
        address="ReaderService" 
        binding="netTcpBinding" bindingConfiguration=""
        contract="Contracts.IMessageReaderService" />
    <endpoint name="netTcpMex" 
        address="mex" 
        binding="mexTcpBinding" bindingConfiguration=""
        contract="IMetadataExchange" />
    <host>
       <baseAddresses>
           <add baseAddress="net.tcp://localhost:8082" />
       </baseAddresses>
    </host>
 </service>

当我尝试在服务主机中运行它时,出现以下异常:
“IMetadataExchange”合同名称未在MessageReaderService实现的合同列表中找到。向配置文件或ServiceHost直接添加ServiceMetadataBehavior以启用对此合同的支持。
因此,我从这个错误中得出结论,我需要添加一个服务行为来公开元数据。
所以我添加了这个行为:
<behavior name="ServiceBehavior">
    <serviceMetadata httpGetEnabled="true"/>                  
</behavior> 

但是我收到了一个不同的错误:

ServiceMetadataBehavior的HttpGetEnabled属性设置为true,HttpGetUrl属性为相对地址,但没有http基址。要么提供一个http基址,要么将HttpGetUrl设置为绝对地址。

  1. 那么现在我必须添加另一个端点(http)来通过mexhttpbinding公开元数据?
  2. 是否有一种简单的方法可以通过tcp公开端点?
1个回答

17

两件事:

(1) 当你定义了服务行为后,当然也必须将其应用到服务中!

<service name="MessageReaderService.MessageReaderService"
         behaviorConfiguration="ServiceBehavior">

(2) 你不需要一个 HTTP 端点,也不需要拥有 HTTP URL,只需按照以下方式定义此服务行为:

<behavior name="ServiceBehavior">
    <serviceMetadata />
</behavior> 

您的元数据现在可以通过 mexTcpBinding 终结点访问 - 您无法使用 HTTP 浏览器来查看它,但客户端一定可以连接并使用它!

您可以使用 WCF Test Client 进行验证,并转到以下任一位置:

net.tcp://localhost:8082        (the base address)
或者
net.tcp://localhost:8082/mex    (the mex address)

在两种情况下,WCF测试客户端现在应该能够找到您的服务并发现其功能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接