Estoy desarrollando una aplicación cliente/servidor en .Net 3.5 usando WCF. Básicamente, un servicio de cliente de larga ejecución (en varias máquinas) establece una conexión dúplex con el servidor a través de un netTcpBinding. Luego, el servidor usa el contrato de devolución de llamada del cliente para realizar ciertas oraciones a pedido, a las cuales el cliente responde de manera asíncrona (creo que es bastante estándar). Subclases la clase DuplexClientBase para manejar la mayor parte de la comunicación.¿Cómo restablezco automáticamente un canal dúplex si se produce una falla?
Desafortunadamente, cuando algo sale mal en cualquiera de los extremos (como una falla de la red, una excepción inesperada, etc.), el canal se bloquea/falla y fallan todas las operaciones subsiguientes. He superado esta limitación en canales no dúplex al crear una clase RecoveringClientBase que se activa automáticamente cuando el cliente ha fallado y vuelve a intentar la operación.
Entonces, mi pregunta es, ¿existe una forma establecida de determinar cuándo ha fallado un canal dúplex? ¿Dónde debo verificar esto, en el servidor o el cliente? En su defecto, ¿qué opciones tengo para garantizar que la conexión se restablezca?
Actualización: Estoy buscando algunos consejos específicos para los canales dúplex, donde el servidor puede intentar utilizar un canal de devolución de llamada que tuvo una falla. Por lo tanto, necesito algo que se vuelva a conectar/volver a suscribir inmediatamente cuando algo le pase al canal. En este momento, estoy escuchando el evento de cierre del canal y lo recreé si el estado no es Cerrado. De alguna manera funciona, pero se siente hacky ...
¿Puede dar un ejemplo de esto? El artículo simplemente sugiere la idea, pero no da ninguna pista sobre la implementación. – Jacob
+1 Jacob. ¿Alguien tiene información sobre cómo hacer que esto funcione? En la actualidad, tuve que recurrir al uso del proxy dinámico de Castle para implementar mi comportamiento de reconexión, pero prefiero agregar este comportamiento a través de Wcf. Estoy leyendo varios blogs Wcf, pero es impenetrable y no tengo ni idea de por dónde empezar, incluso las extensiones simples parecen requerir la creación de muchas clases y resmas de configuración, es desconcertante. –
Agregue un controlador de eventos al evento Faulted a través de la interfaz explícita de ICommunicationObject en su servicio. En el controlador de eventos, cancela() el canal y crea un nuevo canal. – Jakub