Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

mexHttpBinding - Add a ServiceMetadataBehavior to the configuration file or to the ServiceHost directly to enable support for this contract

I know this has been asked many times, and answered many times, but, all the provided samples that should be working don't seem to want to work for me today.

When I try to start the host, I keep getting the following error:

"The contract name 'IMetadataExchange' could not be found in the list of contracts implemented by the service TraceService. Add a ServiceMetadataBehavior to the configuration file or to the ServiceHost directly to enable support for this contract."

My service is being hosted in a managed windows service host as per Microsoft's example: http://msdn.microsoft.com/en-us/library/ms733069%28v=vs.90%29.aspx

And here is my nice and simple config:

  <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>

Of course, the problem becomes more interesting when there are no errors if I remove this line:

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

Any help would be very very very greatly appreciated :)

like image 216
agAus Avatar asked Sep 16 '11 08:09

agAus


2 Answers

Be sure to specify a behaviorConfiguration in the service element of your configuration in order to allow either httpGet or httpsGet.

I see that you have already defined a serviceBehavior named DefaultBehavior - now all you need to do is add behaviorConfiguration="DefaultBehavior" to the service element, so that line becomes:

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

If you don't explicitly specify a behavior for your service, both HTTP GETs and HTTPS GETs are disallowed by default, and your metadata will not be exposed.

like image 56
RoccoC5 Avatar answered Nov 08 '22 13:11

RoccoC5


As you're using WS-Http you are binding to an HTTPS protocol, so you need to use the correct MEX binding;

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

and change the baseaddress to a https one.

Or (the other way around) convert your wsHttp binding to a basicHttp binding and things will start working for you.

like image 42
kroonwijk Avatar answered Nov 08 '22 11:11

kroonwijk