为什么我需要mex端点和httpGetEnable?

时间:2011-09-02 15:27:32

标签: wcf

我想知道为什么我需要声明这个:

 <serviceMetadata httpGetEnabled="true" />

还有这个

<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />

如果我只使用第一个 - 它通过浏览器正常工作为什么我需要第二个?

请您举例说明我必须使用后者的情况吗?

3 个答案:

答案 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文件。