2010-11-30 10 views
16

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.

+0

mira esto Tengo el mismo problema http://stackoverflow.com/questions/3986347/wcf-duplex-retrieve-client-connection – Rev

Respuesta

2

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.

1

Simplemente puede hacer una devolución de llamada justo antes de cerrar el canal de devolución de llamada y decirle al cliente que está cerrando el canal.

Así que antes de esta línea de código:

((ICommunicationObject)client.CallbackChannel).Close(); 
+0

Esto no funciona – Sentry

+0

¿qué le parece proporcionar más detalles sobre lo que no funciona? .... Sé que funciona, ya que hay algún software de programación que ejecuta código usando callbackchannel. No recuerdo la implementación exacta como lo fue hace 6 años, pero estoy de acuerdo, solo digo que no funciona y la respuesta es un poco infantil. –

+0

Las ediciones en la pregunta lo explican, al cerrar la devolución de llamada no se lo notificará al cliente. Tienes que abortar para que el cliente reciba el evento fallado. – Sentry

Cuestiones relacionadas