【问题标题】:exposing net.tcp endpoint暴露 net.tcp 端点
【发布时间】:2012-04-26 01:39:06
【问题描述】:

我对如何在 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 实现。将 ServiceMetadataBehavior 添加到
配置文件或直接发送到 ServiceHost 以启用对本合同的支持。

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

所以我添加了行为:

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

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

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

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

【问题讨论】:

    标签: c# wcf


    【解决方案1】:

    两件事:

    (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 测试客户端现在都应该找到您的服务并能够发现它的功能。

    【讨论】:

      猜你喜欢
      • 2013-02-22
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-03
      • 2021-12-16
      • 2017-01-03
      • 2016-02-07
      相关资源
      最近更新 更多