首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >公开net.tcp端点

公开net.tcp端点
EN

Stack Overflow用户
提问于 2012-04-13 16:57:32
回答 1查看 12.5K关注 0票数 9

我有点搞不懂如何在WCF中公开端点

我有一个tcp端点和一个mex tcp端点。

代码语言:javascript
复制
<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以启用对此契约的支持。

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

所以我加入了这样的行为:

代码语言:javascript
复制
<behavior name="ServiceBehavior">
    <serviceMetadata httpGetEnabled="true"/>                  
</behavior> 

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

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

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

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-13 17:06:32

有两件事:

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

代码语言:javascript
复制
<service name="MessageReaderService.MessageReaderService"
         behaviorConfiguration="ServiceBehavior">

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

代码语言:javascript
复制
<behavior name="ServiceBehavior">
    <serviceMetadata />
</behavior> 

您的元数据现在可以在mexTcpBinding端点上使用--您不能使用HTTP浏览到它,但是客户端绝对可以连接到它并使用它!

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

代码语言:javascript
复制
net.tcp://localhost:8082        (the base address)

代码语言:javascript
复制
net.tcp://localhost:8082/mex    (the mex address)

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

票数 17
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10145086

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档