我想知道为什么我需要声明这个:
<serviceMetadata httpGetEnabled="true" />
还有这个
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
如果我只使用第一个 - 它通过浏览器正常工作。 为什么我需要第二个?
请您举例说明我必须使用后者的情况吗?
答案 0 :(得分:20)
你需要
启用服务发布元数据(即serviceMetadata
行为) - 但不需要 httpGetEnabled
- 这是可选的
有一个位置(端点),查询客户端可以抓取该服务元数据 - 即 MEX端点。这是一种机器可读的元数据格式 - Visual Studio或svcutil可用于创建客户端的格式。它不适合人类消费
答案 1 :(得分:8)
这似乎在以下情况下很有用......
<system.serviceModel>
<services>
<service name="WCFService.Service" behaviorConfiguration="ServiceBehavior">
<host>
<baseAddresses>
<add baseAddress="net.tcp://localhost:8080/WCFService"/>
</baseAddresses>
</host>
<!-- Net.Tcp EndPoints-->
<endpoint address=""
binding="netTcpBinding"
contract="WCFService.IService" />
<endpoint address="mex"
binding="mexTcpBinding"
contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="ServiceBehavior">
<serviceMetadata httpGetEnabled="false" />
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
没有定义HTTP端点,您可以通过以下方式访问您的服务......
- Browser: http://localhost/WCFService/Service.svc
- svcutil.exe net.tcp://localhost:8080/WCFService/Service.svc/mex
如果您注释掉MEX端点,则两者都不起作用。
你想知道为什么元数据仍然可以在浏览器中看到
a)我没有HTTP端点和 b)我特意设定了......
<serviceMetadata httpGetEnabled="false" />
原因是在网站的高级设置中,我在高级设置下为启用的协议定义了以下内容...
http,net.tcp
如果删除http
,则无法在浏览器中看到元数据。似乎在这种情况下,只有net.tcp启用的网站,您需要mex端点。
答案 2 :(得分:2)
MEX端点是允许客户端使用SOAP消息而不是http get请求来接收服务元数据的特殊端点。您可以创建可通过http,https,tcp甚至命名管道访问的MEX端点。
调用MEX端点的GetMetadata操作时将收到的响应将包括WSDL的内容以及链接到它的所有XSD文件。