2010-11-19 22 views
7

Tengo un cliente WCF hablando con un servidor WCF (en la misma máquina). Usamos netTcpBinding con seguridad de nivel de mensajes (utilizando un principalPermissionMode personalizado y una implementación personalizada de serviceCredentials). El servicio está marcado con InstanceContextMode.PerSession.WCF conexión net.tcp muere después de 9 horas, 1 minuto

El servicio WCF se aloja automáticamente en un servicio de Windows (no en IIS).

Para falsificar keep-alive, tenemos un método Ping que el cliente llama cada 15 segundos. Mantenemos el proxy del cliente abierto durante toda la vida del programa cliente (porque inicializar la sesión es costoso en nuestro caso).

A pesar de esto, la conexión se interrumpe después de 9 horas, 1 minuto y un bit (en 10 ejecuciones de prueba, 7 de ellas murieron después de 9h1m6s).

La única consecuencia en los registros de WCF es un mensaje "SocketConnection cancelado", seguido de un conjunto variable de excepciones, pero que generalmente incluye una excepción de "conexión en estado en fallo".

¿Hay algún tiempo de espera en WCF, o en TCP/IP, que está causando esto? Porque estoy perplejo.

+2

10 carreras de prueba, cada una de las cuales toma más de 9 horas? Admiro tu paciencia. –

+0

Honestamente, eso es 2 carreras de prueba de 4 clientes, y 2 al mismo tiempo de 1 cliente. Entonces solo 18 horas, y se fue de la noche a la mañana, de todos modos. –

+3

Si vuelves a pensar con cuidado, '9x3600 + 60 + 6 <32768', que es 2 potencia de 15 – ajreal

Respuesta

3

Después de una investigación tediosa: después de aproximadamente 9 horas, el cliente de WCF vuelve a autenticarse con el servicio. Algo que estoy haciendo durante el paso de autenticación está matando a la sesión existente.

+0

+1 - Me encontré con este problema e independientemente saqué la misma conclusión. Ojalá hubiera tenido el beneficio de su investigación primero, pero no sabía qué buscar. Tengo curiosidad por saber qué fue lo que salió mal con la autenticación. En nuestro caso, estábamos haciendo una autenticación personalizada e intencionalmente no permitimos que el mismo cliente se conectara dos veces, lo que se verificó en la Validación. Entonces, la revalidación siempre falló. –

+0

@JoelLee: Exactamente eso, pero más atrás. Volver a autenticar estaba matando a la sesión back-end anterior, que estaba desencadenando un evento 'Kicked', que me estaba haciendo demoler la sesión de WCF, que mató al cliente. –

2

Según sus comentarios anteriores, estaba realizando las pruebas al mismo tiempo.

¿Estaban también en el mismo servidor, utilizando el mismo grupo de aplicaciones?

Si es así, un reciclaje del grupo de aplicaciones podría haber provocado que todas las pruebas se detengan al mismo tiempo.

+0

Sí, el mismo servidor. No está utilizando IIS, por lo que no hay grupos de aplicaciones. Le pregunté a mi agente de control de calidad para iniciar a los clientes escalonados, para ver si mueren al mismo tiempo o justo después de la misma demora. –

Cuestiones relacionadas