2012-04-12 18 views
6

Estoy trabajando con dos aplicaciones, una tiene un servicio alojado autónomo configurado para usar el enlace net.tcp. El ServiceBehaviorAttribute del servicio está configurado con:WCF: EndpointNotFoundException después de ejecutarse durante un par de segundos

[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple, 
       InstanceContextMode = InstanceContextMode.Single, 
       IncludeExceptionDetailInFaults = true, 
       UseSynchronizationContext = false, 
       ValidateMustUnderstand = false)] 

Por tanto, el servicio y el cliente la transferMode se establece en streaming, y los tiempos de espera son:

closeTimeout="00:01:00" 
openTimeout="00:00:30" 
receiveTimeout="00:02:30" 
sendTimeout="00:02:30" 

MaxConnections se establece en 500 y los usos ServiceThrottlingBehavior WCF los 4 valores por defecto:

  • MaxConcurrentSessions: 100 * ProcessorCount
  • MaxConcurrent Llamadas: 16 * ProcessorCount
  • MaxConcurrentInstances: el valor predeterminado es el total de los dos anteriores, que sigue el mismo patrón que antes.

Estoy usando una máquina de cuatro núcleos y el servicio Net.Tcp Port Sharing está habilitado.

La aplicación de cliente tiene un único canal para el servicio creado utilizando la clase ChannelFactory. Una vez que se crea el canal, se generan 100 hilos. Cada hilo usa el canal para enviar mensajes al servidor con una frecuencia de un mensaje por segundo.

Después de un par de segundos funcionando bien (el cliente envía mensajes al servidor una que ellos recibe correctamente) un EndpointNotFoundException se lanza con el siguiente mensaje:

Could not connect to net.tcp://localhost/service. The connection attempt lasted 
for a time span of 00:00:02.1777100. TCP error code 10061: No connection could 
be made because the target machine actively refused it 127.0.0.1:808. 

Las cosas raras son:

  • Si ejecuto ambas aplicaciones en la misma máquina, el lapso de tiempo de la excepción es de aproximadamente 2 segundos, pero si ejecuto la aplicación de servidor en mi máquina y la aplicación cliente en una máquina diferente, el lapso de la excepción siempre es de 1 segundo .
  • Algunas veces (como una en diez) la excepción no arroja y ambas aplicaciones funcionan bien.
  • Antes de que se produzca la excepción, el servidor recibe los mensajes y los procesa correctamente. No se lanzan excepciones en el servidor.

He hecho un montón de pruebas, lo que reduce la cantidad de hilos, aumentarla, cambiar el cerrar, abrir, recibir y enviar los tiempos de espera para reducir y valores más altos, indicando un valor superior para maxConnections pero el resultado es siempre el lo mismo, en algún momento se lanza EndpointNotFoundException. Estoy a punto de darme por vencido y cambiar el código para que cada hilo tenga su propio canal esperando que esto solucione el problema, pero quiero saber por qué sucede esto. Si alguien sabe lo que estoy haciendo mal o puede indicarme la dirección correcta para seguir investigando, será útil.

+0

¿Cuáles son los puertos de ambas aplicaciones? ¿Has intentado [ejecutar un rastreo] (http://stackoverflow.com/a/9897291/151445), o ha verificado las reservas de puertos? También podría ejecutar [tcpview] (http://technet.microsoft.com/en-us/sysinternals/bb897437) y supervisar las conexiones tcp de ambas aplicaciones. –

+0

El puerto utilizado para ambas aplicaciones es el puerto net.tcp predeterminado, 808. Probaré la aplicación tcpview para monitorear las conexiones, ¡gracias! – Diego

+0

De manera predeterminada, Windows no habilita el uso compartido de puertos. Verificaría que lo haya habilitado correctamente ([consulte aquí] (http://msdn.microsoft.com/en-us/library/ms734772.aspx)). Si es posible, también puede intentar cambiar el puerto de una aplicación, o hacer una prueba dentro de una VM. –

Respuesta

1

De forma predeterminada, Windows no habilita el uso compartido de puertos. Verificaría que lo haya habilitado correctamente (see here).

Si es posible, también puede intentar cambiar el puerto de una aplicación, o hacer pruebas de una dentro de una VM.

Además, para cualquier otra persona que pueda tener el mismo problema, haga lo que Diego ha hecho y verifique que el puerto compartido esté habilitado en la configuración.Añadir portSharingEnabled="true" a la unión:

<system.serviceModel> 
    <bindings> 
    <netTcpBinding name="portSharingBinding" 
        portSharingEnabled="true" /> 
    <services> 
    <service name="MyService"> 
     <endpoint address="net.tcp://localhost/MyService" 
        binding="netTcpBinding" 
        contract="IMyService" 
        bindingConfiguration="portSharingBinding" /> 
    </service> 
    </services> 
</system.serviceModel> 

Tomado de: http://msdn.microsoft.com/en-us/library/ms731810.aspx

Cuestiones relacionadas