【问题标题】:Why do i need both mex endpoint and httpGetEnable?为什么我需要 mex 端点和 httpGetEnable?
【发布时间】:2011-09-02 15:27:32
【问题描述】:

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

 <serviceMetadata httpGetEnabled="true" />

还有这个

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

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

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

【问题讨论】:

    标签: wcf


    【解决方案1】:

    你需要

    • 让服务完全发布元数据(这是 serviceMetadata 行为) - 但您不需要 httpGetEnabled - 这是可选的

    • 有一个地方(端点),查询客户端可以获取该服务元数据 - 这就是 MEX 端点。这是用于元数据的机器可读格式 - Visual Studio 或 svcutil 可以用来创建客户端的格式。它不适合人类食用

    【讨论】:

    • 但他也可以在没有 mex 端点的情况下做到这一点,这意味着 wsdl ... 所以?
    • 如果我省略“mex endoint” - “svcutil” 将无法抓取它?
    • @mid787:你似乎是对的——有了&lt;serviceMetadata httpGetEnabled="true" /&gt;,你(还有svcutil)可以在没有任何MEX端点的情况下从URL获取WSDL——所以你可能真的不需要,只要您的服务公开发布 WSDL
    • 那我为什么还需要 mex 呢?我相信即使没有 MEX 点 VS 也能抢到它
    • @mid787:如果您的服务,例如仅发布 nettcp(或 msmq)端点 - 您不能完全“浏览”到 netTCP 地址或 msmq 队列......另外:许多公司不允许“在线”发布 ?wsdl - 他们的公司禁止这样做,例如安全指南 - 但是像 MEX 这样的自定义协议是可以的。
    【解决方案2】:

    这似乎在以下情况下很有用...

    <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,则无法在浏览器中看到元数据。在这种情况下,您似乎需要 mex 端点。

    【讨论】:

      【解决方案3】:

      MEX 端点是允许客户端通过使用 SOAP 消息而不是 http get 请求来接收服务的元数据的特殊端点。您可以创建可以通过 http、https、tcp 甚至命名管道访问的 MEX 端点。

      在调用 MEX 端点的 GetMetadata 操作时您将收到的响应将包括 WSDL 的内容以及链接到它的所有 XSD 文件。

      【讨论】:

        猜你喜欢
        • 2017-10-07
        • 2014-10-26
        • 2019-06-09
        • 2018-11-04
        • 2012-05-21
        • 2017-03-09
        • 2016-02-09
        • 2020-09-05
        • 2012-12-03
        相关资源
        最近更新 更多