c# wcf .net-4.0 net.tcp

c# - Detectar la desconexión del zócalo en WCF



.net-4.0 net.tcp (2)

Estamos construyendo un servidor WCF (.NET 4.0). Solo utilizará el transporte net.tcp.

Cuando un cliente cierra la conexión TCP, el servidor obtiene CommunicationException no administrada y termina.

Q1. ¿Cómo manejo la excepción de comunicación para que el servidor no se cierre y continúe sirviendo a otros clientes?

Q2. En el controlador, ¿cómo obtengo SessionId de la sesión que fue abortada? Necesito esto para limpiar algunos datos específicos de la sesión.

¡Gracias por adelantado!

PS La conexión se realiza a través de Internet, por lo que el socket puede cerrarse en cualquier momento, independientemente de si el cliente se desconecta correctamente o no.


Cualquier canal WCF implementa ICommunicationObject , que proporciona eventos para la vida útil del canal.

Debes escuchar el evento Faulted

Se puede acceder a sessionId como siempre desde la propiedad OperationContext.Current .

Cuando su cliente abra el canal (en la primera operación), regístrese para los eventos adecuados:

OperationContext.Current.Channel.Faulted += new EventHandler(Channel_Faulted); OperationContext.Current.Channel.Closed += new EventHandler(Channel_Faulted);

y:

void Channel_Faulted(object sender, EventArgs e) { Logout((IContextChannel)sender); } protected void Logout(IContextChannel channel) { string sessionId = null; if (channel != null) { sessionId = channel.SessionId; } [...] }


ICommunicationObject obj = (ICommunicationObject)callback; obj.Closed += new EventHandler((a, b) => { if (list.Exists(cli => cli.CallbackService == (ITecnobelRemoteServiceCallback)a)) { var query = (from cc in list where cc.CallbackService == (ITecnobelRemoteServiceCallback)a select cc).ToList(); query.ForEach( delegate (Client ccc) { ccc.CallbackService = null; }); } });