公开 Net.tcp 终结点
本文关键字:结点 tcp Net 公开 | 更新日期: 2023-09-27 18:30:58
我对如何在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实现。将服务元数据行为
添加到 配置文件或直接发送到服务主机以启用对此协定的支持。
因此,我从此错误中得出结论,我需要添加服务行为来公开元数据。
所以我添加了行为:
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="true"/>
</behavior>
但随后我得到一个不同的错误:
ServiceMetadataBehavior 的 HttpGetEnabled 属性设置为 true,并且 HttpGetUrl 属性是一个相对地址,但没有 http 基址。也 提供 HTTP 基址或将 HttpGetUrl 设置为绝对地址。
- 所以现在我必须实际添加另一个端点 (http) 以通过 mexhttpbinding 公开元数据?
- 有没有一种简单的方法可以通过TCP公开端点?
两件事:
(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 测试客户端现在都应该找到您的服务并能够发现其功能。