WCF: cómo detectar el lado del cliente si el servidor me desconecta
callback notify (2)
Tengo un servicio auto-alojado de WCF con un net.tcp DuplexChannel. En el servidor ejecuto lo siguiente para desconectar un cliente:
((ICommunicationObject)client.CallbackChannel).Close();
Esto funciona bien, pero ¿cómo detecto en el cliente que se ha desconectado?
Me he conectado a eventos cerrados y con fallos tanto en el InstanceContext de la devolución de llamada como en el canal al servidor:
InstanceContext callback = new InstanceContext(callbackImp);
callback.Closed += new EventHandler(callback_Closed);
y
((ICommunicationObject)Channel).Closed += new EventHandler(Channel_Closed);
Pero nada funciona. Nunca me avisan. La solución que estoy usando ahora es tener un método en la devolución de llamada que, en su lugar, provoque una desconexión del lado del cliente. Pero prefiero no hacerlo de esta manera. Especialmente no quiero dejar que el servidor espere a que un usuario se desconecte.
EDITAR
Acabo de darme cuenta de que cuando me desconecto del lado del cliente, ejecuto un método en el contrato de servicio que está marcado con IsTerminating = true:
[OperationContract(IsTerminating = true)]
void Disconnect();
Pensé que sería lo mismo en el contrato de devolución de llamada, entonces? Intenté agregar el mismo método a mi devolución de llamada y terminó el canal de devolución de llamada desde el punto de vista del servidor, pero aún así no me notificaron en el lado del cliente ... extraño
EDITAR
Me enteré de más información sobre esto:
Cuando el servidor aborta el canal de devolución de llamada, una falla se traslada al cliente, la falla del cliente y obtenemos el evento Faulted en el cliente.
Cuando el servidor cierra el canal de devolución de llamada, la sesión sigue abierta hasta que el cliente emita el cierre.
Una vez que el cliente cierre el canal, verá el evento Cerrado.
De acuerdo con esta declaración, el evento de cierre no se activa al cerrar el canal de llamada desde el servidor, el cliente también debe cerrarlo. Por lo tanto, podría ejecutar Close en el cliente en el método de desconexión de terminación de la devolución de llamada. O podría usar el método Abort en el lado del servidor de devolución de llamada y omitir usando un método Disconnect en la devolución de llamada. No sé cuál prefiero honestamente. Hmmmm
EDITAR
Fui con el Abort-enfoque. Parecía el método más lógico y funciona muy bien. El cliente recibe una notificación con el evento Faulted en el callback-instancecontext. Bonito.
Fui con el Abort-enfoque. Parecía el método más lógico y funciona muy bien. El cliente recibe una notificación con el evento Faulted en el callback-instancecontext.
Simplemente puede hacer una devolución de llamada justo antes de cerrar el canal de devolución de llamada que le dice al cliente que está cerrando el canal.
Así que justo antes de esta línea de código:
((ICommunicationObject)client.CallbackChannel).Close();