2012-04-13 19 views
9

estoy un poco confundido de cómo exponer un punto final en WCFexponiendo punto final net.tcp

Tengo un extremo TCP y un punto final TCP Mex.

<service name="MessageReaderService.MessageReaderService"> 
    <endpoint name="NetTcpReaderService" 
     address="ReaderService" 
     binding="netTcpBinding" bindingConfiguration="" 
     contract="Contracts.IMessageReaderService" /> 
    <endpoint name="netTcpMex" 
     address="mex" 
     binding="mexTcpBinding" bindingConfiguration="" 
     contract="IMetadataExchange" /> 
    <host> 
     <baseAddresses> 
      <add baseAddress="net.tcp://localhost:8082" /> 
     </baseAddresses> 
    </host> 
</service> 

Cuando trato de ejecutar esto en el host de servicio me da la siguiente excepción:

El nombre de contrato 'IMetadataExchange' no se pudo encontrar en la lista de contratos implementado por el MessageReaderService servicio . Agregue un ServiceMetadataBehavior al archivo de configuración
o al ServiceHost directamente para habilitar el soporte para este contrato.

Así que concluyo de este error que necesito agregar un comportamiento de servicio para exponer los metadatos.

por lo que añade el comportamiento:

<behavior name="ServiceBehavior"> 
    <serviceMetadata httpGetEnabled="true"/>     
</behavior> 

pero cuando me siento un error diferente:

La propiedad de ServiceMetadataBehavior HttpGetEnabled se establece en true y la HttpGetUrl propiedad es una dirección relativa, pero no hay una dirección de base http. O proporciona una dirección base http o establece HttpGetUrl en una dirección absoluta.

  1. Así que ahora tengo que añadir en realidad otro punto final (http) para exponer los metadatos sobre mexhttpbinding?
  2. ¿hay una manera simple de exponer el punto final sobre tcp?

Respuesta

16

dos cosas:

(1) una vez que haya definido el comportamiento en servicio, que por supuesto debe también aplicarlo al servicio!

<service name="MessageReaderService.MessageReaderService" 
     behaviorConfiguration="ServiceBehavior"> 

(2) que no es necesario un punto final HTTP - usted no necesita tener una dirección URL HTTP - acaba de definir este comportamiento en servicio de esta manera:

<behavior name="ServiceBehavior"> 
    <serviceMetadata /> 
</behavior> 

Su metadatos ya está disponible sobre un punto final mexTcpBinding - no puede navegar a través de HTTP, pero un cliente definitivamente puede conectarse y usarlo.

Esto se puede comprobar mediante el uso de la WCF Test Client e ir a cualquiera

net.tcp://localhost:8082  (the base address) 

o

net.tcp://localhost:8082/mex (the mex address) 

en ambos casos, el cliente de prueba WCF debe ahora encontrar su servicio y ser capaz de descubrir su capacidades.

Cuestiones relacionadas