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

Roy*_*mir 24 wcf

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

 <serviceMetadata httpGetEnabled="true" />
Run Code Online (Sandbox Code Playgroud)

还有这个

<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*c_s 20

你需要

  • 启用该服务发布的所有元数据(这是serviceMetadata行为) -但你并不需要httpGetEnabled-这是可选

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

  • @ mid787:如果你的服务例如只发布`nettcp`(或`msmq`)端点 - 你不能完全"浏览"到netTCP地址或msmq队列......还有:很多公司都不允许`? wsdl`将在线发布 - 它被公司禁止,例如安全指南 - 但是像MEX这样的自定义协议是可以的. (6认同)
  • 那么为什么我需要mex呢?我相信即使没有MEX点,VS也能抓住它 (2认同)

Rem*_*tec 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>
Run Code Online (Sandbox Code Playgroud)

没有定义HTTP端点,您可以通过以下方式访问您的服务......

 - Browser: http://localhost/WCFService/Service.svc    
 - svcutil.exe net.tcp://localhost:8080/WCFService/Service.svc/mex
Run Code Online (Sandbox Code Playgroud)

如果您注释掉MEX端点,则两者都不起作用.

你想知道为什么元数据仍然可以在浏览器中看到

a)我没有HTTP端点,b)我已经专门设置了......

<serviceMetadata httpGetEnabled="false" />
Run Code Online (Sandbox Code Playgroud)

原因是在网站的高级设置中,我在"高级设置"下为"启用的协议"定义了以下内容...

http,net.tcp

如果删除http则无法在浏览器中看到元数据.似乎在这种情况下,只有net.tcp启用的网站,您需要mex端点.