我对如何在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设置为绝对地址.
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测试客户端现在应该找到您的服务并能够发现其功能.