mexHttpBinding - добавьте ServiceMetadataBehavior в файл конфигурации или непосредственно в ServiceHost, чтобы включить поддержку этого контракта. - PullRequest
12 голосов
/ 16 сентября 2011

Я знаю, что об этом спрашивали много раз и отвечали много раз, но все предоставленные образцы, на которых должен работать, похоже, не хотят работать на меня сегодня.

Когда я пытаюсь запустить хост, я получаю следующую ошибку:

"Не удалось найти имя контракта 'IMetadataExchange' в списке контрактов, реализованных службой TraceService. Добавьте ServiceMetadataBehavior в конфигурациюфайл или непосредственно в ServiceHost, чтобы включить поддержку этого контракта. "

Моя служба размещена на управляемом хосте службы Windows в соответствии с примером Microsoft: http://msdn.microsoft.com/en-us/library/ms733069%28v=vs.90%29.aspx

А вот мой хорошийи простой конфиг:

  <system.serviceModel>
    <services>
      <service name="Daff.Lae.Service.TraceService">
        <endpoint address="" binding="wsHttpBinding" name="TraceService" contract="Contracts.Service.ITraceService">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8080/TraceService" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <serviceBehaviors>
        <behavior name="DefaultBehavior">
          <serviceDebug includeExceptionDetailInFaults="true"/>
          <serviceMetadata httpGetEnabled="true"/>
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>

Конечно, проблема становится более интересной, когда нет ошибок, если я уберу эту строку:

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

Любая помощь будет очень очень очень цениться:)

Ответы [ 3 ]

25 голосов
/ 21 сентября 2011

Обязательно укажите behaviorConfiguration в элементе service вашей конфигурации, чтобы разрешить либо httpGet, либо httpsGet.

Я вижу, что вы уже определили serviceBehavior с именем DefaultBehavior - теперь все, что вам нужно сделать, это добавить behaviorConfiguration="DefaultBehavior" к элементу service, чтобы эта строка стала такой:

<service name="Daff.Lae.Service.TraceService" behaviorConfiguration="DefaultBehavior">

Если вы не указали явно поведение для своей службы, оба HTTPGET и HTTPS GET запрещены по умолчанию, и ваши метаданные не будут отображаться.

2 голосов
/ 21 сентября 2011

Поскольку вы используете WS-Http, вы привязываетесь к протоколу HTTPS, поэтому вам нужно использовать правильную привязку MEX;

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

и измените базовый адрес на https.

Или (наоборот) преобразовать привязку wsHttp в привязку basicHttp, и все начнет работать для вас.

0 голосов
/ 04 января 2018
`<services>
  <service  name="MyService.Service1" behaviorConfiguration="Service1" >

</services>
 `

 where MyService is the application name , Service1 is the default implementation class for IService1
 `
 <protocolMapping>
  //Remove any http or https bindings provided  
</protocolMapping>   
 `
It should help when you use WCF Application Project
...