Search code examples
wcfnamed-pipesservicehost

WCF Launching host error


I want to launch the following WCF service:

<system.serviceModel>
  <services>
   <service name="MTPlatform">
      <endpoint address="TradingService" behaviorConfiguration="ServiceBehaviour"
               binding="netNamedPipeBinding"  
               bindingConfiguration="NetNamedPipeBinding_IGenericTradingInterface"
               contract="GenericTradingInterface.IGenericTradingInterface"
               name="TradingService"  />
      <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" />
      <host>
        <baseAddresses>
           <add baseAddress="net.pipe://localhost" />
        </baseAddresses>
        <timeouts closeTimeout="00:00:02" openTimeout="00:00:20" />
      </host>
   </service>
  </services>
  <bindings>
     <netNamedPipeBinding>
        <binding name="NetNamedPipeBinding_IGenericTradingInterface"
                 closeTimeout="00:05:20" openTimeout="00:00:20" receiveTimeout="05:20:00"
                 sendTimeout="00:10:00" transactionFlow="false" transferMode="Buffered"
                 transactionProtocol="OleTransactions" hostNameComparisonMode="StrongWildcard"
                 maxBufferPoolSize="2147483646" maxBufferSize="2147483646" maxConnections="10"
                 maxReceivedMessageSize="2147483646">
              <readerQuotas maxDepth="2147483646" maxStringContentLength="2147483646"
                            maxArrayLength="2147483646" maxBytesPerRead="2147483646" 
                            maxNameTableCharCount="2147483646" />
              <security mode="Transport">
                 <transport protectionLevel="EncryptAndSign" />
              </security>
         </binding>
     </netNamedPipeBinding>
   </bindings>
   <behaviors>
       <endpointBehaviors>
           <behavior name="ServiceBehaviour">
               <dataContractSerializer maxItemsInObjectGraph="2147483646" />
           </behavior>
       </endpointBehaviors>
       <serviceBehaviors>
           <behavior name="MetaDataBehavior">
                <serviceMetadata />
           </behavior>
       </serviceBehaviors>
   </behaviors>
</system.serviceModel>

This fails with:

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

I don't see big mistakes here, where can one find IMetadataExchange?

Thanks,

Juergen


Solution

  • You need to reference the service behavior called "MetaDataBehavior" in your <service> element. Also, for the sake of the sanity of other developers in your team, please don't have an endpoint behavior with a name "ServiceBehaviour" - that's asking for trouble :)

    <system.serviceModel>
    <services> 
     <service name="MTPlatform" behaviorConfiguration="MetaDataBehavior"> 
      <endpoint address="TradingService" behaviorConfiguration="IncreaseMIIOGEndpointBehaviour" 
       binding="netNamedPipeBinding" bindingConfiguration="NetNamedPipeBinding_IGenericTradingInterface" 
       name="TradingService" contract="GenericTradingInterface.IGenericTradingInterface" /> 
      <endpoint address="mex" binding="mexNamedPipeBinding" contract="IMetadataExchange" /> 
      <host> 
       <baseAddresses> 
        <add baseAddress="net.pipe://localhost" /> 
       </baseAddresses> 
       <timeouts closeTimeout="00:00:02" openTimeout="00:00:20" /> 
      </host> 
     </service> 
    </services> 
    <behaviors> 
     <endpointBehaviors> 
      <behavior name="IncreaseMIIOGEndpointBehaviour"> 
       <dataContractSerializer maxItemsInObjectGraph="2147483646" /> 
      </behavior> 
     </endpointBehaviors> 
     <serviceBehaviors> 
      <behavior name="MetaDataBehavior"> 
       <serviceMetadata /> 
      </behavior> 
     </serviceBehaviors> 
    </system.serviceModel>