2012-04-13 156 views
9

我对如何暴露WCF端点有些困惑暴露net.tcp端点

我有一个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实现合同 的列表中找到。将ServiceMetadataBehavior添加到
配置文件或直接添加到ServiceHost以启用对此合同的支持。

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

所以我添加的行为:

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

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

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

  1. 所以现在我有实际添加另一个端点(HTTP)暴露在mexhttpbinding元数据?
  2. 有没有一种简单的方法通过tcp公开端点?

回答

16

两件事情:

(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测试客户端现在应该找到你的服务,并能够发现验证这一点的能力。