Зачем мне нужна и mex конечная точка, и httpGetEnable?

Мне было интересно, почему я должен объявить это:

 <serviceMetadata httpGetEnabled="true" />

а также это

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

Если я использую только первый - он работает через браузер.так зачем мне второй?

Можете ли вы дать мне пример, пожалуйста, для ситуации, в которой я буду использовать последний?

3 ответа

Решение

Вам нужно

  • разрешить службе публиковать метаданные вообще (это serviceMetadata поведение) - но вам не нужно httpGetEnabled - это необязательно

  • иметь место (конечную точку), где запрашивающий клиент может получить метаданные службы - это конечная точка MEX. Это для машиночитаемого формата метаданных, который Visual Studio или svcutil могут использовать для создания клиента. Он не предназначен для потребления человеком

Это кажется полезным в следующей ситуации...

<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, ни то, ни другое не будет работать.

Вы удивляетесь, почему метаданные все еще можно увидеть в браузере как

а) у меня нет конечной точки HTTP и б) я специально установил...

<serviceMetadata httpGetEnabled="false" />

Это связано с тем, что в расширенных настройках веб-сайта для расширенных протоколов в разделе "Дополнительные настройки" было определено следующее...

http,net.tcp

Если вы удалите http тогда метаданные не будут видны в браузере. Казалось бы, именно в этом сценарии вам нужен только сайт с поддержкой net.tcp, и вам нужна конечная точка mex.

Конечные точки MEX - это специальные конечные точки, которые позволяют клиентам получать метаданные службы, используя сообщения SOAP вместо запросов http get. Вы можете создать конечную точку MEX, к которой можно получить доступ через http, https, tcp и даже по именованным каналам.

Ответ, который вы получите при вызове операции GetMetadata конечной точки MEX, будет включать содержимое WSDL и все файлы XSD, связанные с ним.

Другие вопросы по тегам