2010-11-12 8 views
11

Tengo un servicio WCF alojado como un servicio de Windows. Nos gustaría habilitar un punto final mex en la misma dirección (pero con un sufijo '/ mex'). He estado tratando de hacer esto (sin éxito) con la siguiente configuración:Cómo forzar un punto final net.tcp mex (mexTcpBinding) para participar en el intercambio de puertos?

<system.serviceModel> 

    <services> 
    <service 
     name="MyCompany.MyService" 
     behaviorConfiguration="defaultServiceBehavior"> 

     <host> 
     <baseAddresses> 
      <add baseAddress="net.tcp://localhost"/> 
     </baseAddresses> 
     </host> 

     <endpoint 
     address="MyService" 
     binding="netTcpBinding" 
     contract="MyCompany.IMyService" 
     bindingConfiguration="netTcpBindingConfig" 
     /> 

     <endpoint 
     address="MyService/mex" 
     binding="mexTcpBinding" 
     contract="IMetadataExchange" 
     /> 

    </service> 
    </services> 

    <behaviors> 
    <serviceBehaviors> 
     <behavior name="defaultServiceBehavior"> 
     <serviceMetadata /> 
     </behavior> 
    </serviceBehaviors> 
    </behaviors> 

    <bindings> 
    <netTcpBinding> 
     <binding name="netTcpBindingConfig" portSharingEnabled="true" /> 
    </netTcpBinding> 
    </bindings> 

</system.serviceModel> 

Cuando se ejecuta, el host de servicio se emite una AddressAlreadyInUseException quejaba de que "Ya hay un oyente en el punto final IP 0.0.0.0:808". Esto realmente tiene sentido para mí porque el servicio de puerto compartido ha abierto ese puerto para servir el punto final MyService junto con cualquier otro servicio que solicite compartir ese puerto en esta máquina.

por lo que parece que el punto final mex quiere tener acceso al puerto 808. Exclusivo puedo solucionar este retocando el mex punto final así:

<endpoint 
    address="net.tcp://localhost:818/MyService/mex" 
    binding="mexTcpBinding" 
    contract="IMetadataExchange" 
    /> 

Esto significa que el punto final Mex ahora tiene su propio puerto exclusivo . La desventaja de esto es que cualquier otro servicio que quiera exponer un punto final mex también necesitará un puerto único para su punto final mex. Esto hace que sea muy impredecible cuando se buscan puntos finales mex.

¿Hay alguna manera de forzar al punto final mex a participar en el intercambio de puertos?

+0

Es sólo una idea: Añadir bindingConfiguration = "netTcpBindingConfig" a la Mex punto final? –

+0

@Torben Sí, lo intenté. Cuando lo hago, el punto final mex no tiene problemas para compartir, pero no puede generar ningún metadato. –

Respuesta

8

dos opciones:

  1. La forma más fácil: cambiar el enlace para el punto mex a netTcpBinding entero y tiene que volver a utilizar su bindingConfiguration. mexTCPBinding es solo una conveniencia y es opcional. Si no funciona para usted, no lo use.

  2. La manera más difícil: puede modificar el mexTCPBinding para permitir el uso compartido. El único ejemplo que he visto es en el código aquí: http://blogs.msdn.com/b/drnick/archive/2006/08/23/713297.aspx

+0

Gracias por su respuesta. Traté de cambiar mexTcpBinding a netTcpBinding pero no a los dados. Cuando lo hago, el servicio se inicia y no se queja de compartir problemas (lo cual es genial) pero no responde a las solicitudes mex (lo que no es bueno). ¿Presumiblemente hay algo más que necesito configurar si utilizo netTcpBinding de lo que no estoy enterado? –

+0

@Damian ¿alguna vez resolvió esto? Extrañamente estamos viendo este problema en mi máquina local, pero no en la producción –

+1

La manera más fácil me funcionó (Opción 1). –

Cuestiones relacionadas