mexTcpBinding в WCF - ошибки IMetadataExchange

Я хочу, чтобы работала служба WCF-over-TCP. У меня возникли проблемы с изменением моего собственного проекта, поэтому я решил начать с «базового» шаблона WCF, включенного в VS2008.

Вот исходный файл WCF App.config, и когда я запускаю службу, тестовый клиент WCF может нормально работать с ним:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <compilation debug="true" />
    </system.web>
    <system.serviceModel>
        <services>
            <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="http://localhost:8731/Design_Time_Addresses/WcfTcpTest/Service1/" />
                    </baseAddresses>
                </host>
                <endpoint address="" binding="wsHttpBinding" contract="WcfTcpTest.IService1">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="WcfTcpTest.Service1Behavior">
                    <serviceMetadata httpGetEnabled="True"/>
                    <serviceDebug includeExceptionDetailInFaults="True" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Это работает отлично, никаких проблем.

Я решил, что изменить его с HTTP на TCP будет тривиально: измените привязки на их эквиваленты TCP и удалите элемент httpGetEnabled serviceMetadata:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.web>
        <compilation debug="true" />
    </system.web>
    <system.serviceModel>
        <services>
            <service name="WcfTcpTest.Service1" behaviorConfiguration="WcfTcpTest.Service1Behavior">
                <host>
                    <baseAddresses>
                        <add baseAddress="net.tcp://localhost:1337/Service1/" />
                    </baseAddresses>
                </host>
                <endpoint address="" binding="netTcpBinding" contract="WcfTcpTest.IService1">
                    <identity>
                        <dns value="localhost"/>
                    </identity>
                </endpoint>
                <endpoint address="mex" binding="mexTcpBinding" contract="IMetadataExchange"/>
            </service>
        </services>
        <behaviors>
            <serviceBehaviors>
                <behavior name="WcfTcpTest.Service1Behavior">
                    <serviceDebug includeExceptionDetailInFaults="True" />
                </behavior>
            </serviceBehaviors>
        </behaviors>
    </system.serviceModel>
</configuration>

Но когда я запускаю это, я получаю эту ошибку в узле службы WCF:

System.InvalidOperationException: имя контракта «IMetadataExchange» не может быть найдено в списке контрактов, реализованных службой Service1. Добавьте ServiceMetadataBehavior в файл конфигурации или непосредственно в ServiceHost, чтобы включить поддержку этого контракта.

У меня такое ощущение, что вы не можете отправлять метаданные с помощью TCP, но в этом случае, почему есть опция mexTcpBinding?


person Dai    schedule 05.04.2010    source источник


Ответы (1)


Что ж, если вы хотите иметь метаданные - TCP или HTTP - вам все равно нужно включить поведение serviceMetadata!

<behaviors>
    <serviceBehaviors>
        <behavior name="WcfTcpTest.Service1Behavior">
            <serviceDebug includeExceptionDetailInFaults="True" />
            <serviceMetadata />
        </behavior>
    </serviceBehaviors>
</behaviors>

Конечно, у вас не может быть «HttpGetEnabled», но должно присутствовать само поведение, чтобы разрешить обмен метаданными (и, следовательно, IMetadataExchange контракт).

person marc_s    schedule 05.04.2010
comment
Спасибо! Это сделало это. Я не думаю, что конфигурация WCF была разработана как раз тогда. App.config - это файл конфигурации, я предположил, что когда элемент конфигурации был удален, это просто означает, что я явно не устанавливаю какую-либо конфигурацию, кроме Отключить эту функцию. Лучше было бы это: ‹serviceMetadata enabled = true /› - person Dai; 05.04.2010
comment
@ Дэвид: ну, об этом варианте можно долго спорить. WCF просто использует, если его нет, это не активный подход. Как только вы это узнаете, это нормально и имеет большой смысл (вам не нужно вставлять его туда и устанавливать active = false, чтобы отключить его - просто оставьте это) - person marc_s; 05.04.2010