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>

当我尝试在服务主机中运行它时,出现以下异常:

在服务 MessageReaderService 实施的合同列表中找不到合同名称“IMetadataExchange”。将 ServiceMetadataBehavior 添加到
配置文件或直接添加到 ServiceHost 以启用对此协定的支持。

所以我从这个错误中得出结论,我需要添加一个服务行为来公开元数据。

所以我添加了行为:

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

但后来我得到一个不同的错误:

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

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

1 回答 1

17

两件事情:

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

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

(2) 您不需要 HTTP 端点 - 您不需要 HTTP URL - 只需像这样定义此服务行为:

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

您的元数据现在可以通过mexTcpBinding端点获得 - 您无法使用 HTTP 浏览到它,但客户端绝对可以连接到它并使用它!

您可以使用WCF 测试客户端验证这一点,然后转到

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

或者

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

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

于 2012-04-13T17:06:32.393 回答