我有点搞不懂如何在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> 但是我得到了一个不同的错误:
HttpGetEnabled属性ServiceMetadataBehavior设置为true,HttpGetUrl属性是相对地址,但没有http基地址。要么提供http基地址,要么将HttpGetUrl设置为绝对地址。
发布于 2012-04-13 17:06:32
有两件事:
(1)一旦定义了服务行为,当然还必须将它应用到服务中!
<service name="MessageReaderService.MessageReaderService"
behaviorConfiguration="ServiceBehavior">(2)您不需要HTTP端点--您不需要有HTTP -只需像这样定义这个服务行为:
<behavior name="ServiceBehavior">
<serviceMetadata />
</behavior> 您的元数据现在可以在mexTcpBinding端点上使用--您不能使用HTTP浏览到它,但是客户端绝对可以连接到它并使用它!
您可以使用WCF测试客户端来验证这一点,然后转到
net.tcp://localhost:8082 (the base address)或
net.tcp://localhost:8082/mex (the mex address)在这两种情况下,WCF客户端现在都应该找到您的服务并能够发现它的功能。
https://stackoverflow.com/questions/10145086
复制相似问题