2011-01-01 4 views
14

Estamos utilizando un modelo pub-sub en nuestra aplicación WCF que prácticamente sigue la muestra de Microsoft: Design Patterns: List-Based Publish-Subscribe.Gestión de clientes descartados en una aplicación WCF de vinculación dúplex

Si bien el servicio proporciona una noción de subscribe() y unsubscribe(), ¿cuál es la mejor práctica para manejar la limpieza en el caso de que un cliente fallezca o falle el canal? Actualmente, cuando un cliente se suscribe adjunto a los manipuladores de la corriente InstanceContext 's Closed y Faulted eventos (los usuarios de los servicios de un modo de contexto instancia PerSession y NetTcpBinding):

_communicationObject = OperationContext.Current.InstanceContext; 
_communicationObject.Closed += OnClientLost; 
_communicationObject.Faulted += OnClientLost; 

El manejador OnClientLost simplemente cancela la suscripción del cliente, sin embargo:

  1. ¿Es lo anterior una buena práctica y solo lo suficientemente robusto como para detectar todas las situaciones cuando un cliente abandona la comunicación dúplex? ¿O debería el servicio solo manejar las excepciones encontradas en el punto en que intenta comunicarse con el cliente y manejar la limpieza?
  2. Además de anular la suscripción del controlador de devolución de llamada del cliente, ¿se debería realizar una limpieza adicional, especialmente en el caso de un error?

This question plantea una pregunta similar, pero en última instancia no proporciona respuestas a los casos fuera del cliente que llama suscribirse y/o darse de baja

Gracias

Respuesta

8

Hice algunas pruebas donde adjunté manejadores a los eventos Cerrado y Fallado del canal de devolución de llamada, luego maté al cliente en el punto justo antes de que el servidor invocara la devolución de llamada. En cada prueba, el evento Cerrado/Fallado se activó instantáneamente y antes de que el servidor intentara invocar la devolución de llamada. De todos modos, todavía tengo la invocación de devolución de llamada envuelta en un bloque try-catch porque la destrucción del canal cliente podría ocurrir al igual que otro hilo estaba ingresando la devolución de llamada.

La única limpieza necesaria fue eliminar la referencia al canal de devolución de llamada. WCF y el recolector de basura hacen el resto.

2

Manejo de esos eventos va a mantener su lista de suscriptores sincronizados. De hecho, es lo suficientemente robusto. Solo recuerde que si un cliente se cae durante la transmisión de un mensaje, es posible que obtenga una excepción antes de que esos eventos se activen, así que prepárese para ignorarlos para que los eventos se puedan solucionar.

Excepto para eliminar al cliente de la lista de suscriptores, la limpieza adicional depende completamente de su aplicación (es decir, liberar los recursos que adquirió cuando el cliente se conectó). No tengo conocimiento de ninguna otra limpieza que se requiera.

Cuestiones relacionadas