暴露net.tcp端点

era*_*zap 9 c# wcf

我对如何在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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

所以我添加了这个行为:

<behavior name="ServiceBehavior">
    <serviceMetadata httpGetEnabled="true"/>                  
</behavior> 
Run Code Online (Sandbox Code Playgroud)

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

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

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

mar*_*c_s 16

两件事情:

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

<service name="MessageReaderService.MessageReaderService"
         behaviorConfiguration="ServiceBehavior">
Run Code Online (Sandbox Code Playgroud)

(2)您不需要HTTP端点 - 您不需要拥有HTTP URL - 只需定义此服务行为,如下所示:

<behavior name="ServiceBehavior">
    <serviceMetadata />
</behavior> 
Run Code Online (Sandbox Code Playgroud)

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

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

net.tcp://localhost:8082        (the base address)
Run Code Online (Sandbox Code Playgroud)

要么

net.tcp://localhost:8082/mex    (the mex address)
Run Code Online (Sandbox Code Playgroud)

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