Tengo un servicio WCF auto-alojado con un Net.tcp DuplexChannel. En el servidor que ejecute el siguiente desconectar un cliente:WCF: cómo detectar el lado del cliente si el servidor me desconecta
((ICommunicationObject)client.CallbackChannel).Close();
Esto funciona bien, pero ¿cómo puedo detectar en el cliente que se ha desconectado?
he conectado a cerrado y con errores-eventos tanto en el InstanceContext de la devolución de llamada y el canal en el 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 notifican. La solución alternativa que estoy usando ahora es tener un método en la devolución de llamada que desencadena una desconexión del lado del cliente. Pero prefiero no hacerlo de esta manera. Especialmente no quiero que el servidor espere a que un usuario se desconecte.
EDITAR
me he dado cuenta de que al desconectar del lado del cliente corro un método en el servicio de contrato que está marcado con IsTerminating = true:
[OperationContract(IsTerminating = true)]
void Disconnect();
que pensé que sería lo mismo en el contrato de devolución de llamada entonces? He intentado añadir el mismo método de devolución de llamada a mi y se puso fin a la devolución de llamada canales desde el punto de vista del servidor pero todavía didnt consiguió notificado en el lado del cliente ... raro
EDITAR
I averiguado algo más de información acerca de esto:
Cuando el servidor se interrumpe el canal de devolución de llamada , un fallo viaja de vuelta al cliente , los fallos de los clientes y que consiguen el evento con fallo 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 cierra el canal , verá el evento Cerrado.
De acuerdo con esta afirmación, Close-event no se desencadena mearly al cerrar el callbackchannel del servidor, el cliente debe cerrarlo también. Así que podría ejecutar Cerrar 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 el uso de un método Disconnect en la devolución de llamada. No sé cuál prefiero honestamente. Hmmmm
EDITAR
Fui con el Abortar-enfoque. Parecía el método más lógico y funciona realmente bien. El cliente recibe una notificación con el evento Faulted en callback-instancecontext. Bonito.
mira esto Tengo el mismo problema http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev