2010-05-07 12 views
5

Tengo una aplicación WCF que está utilizando sesiones.WCF: ¿Cómo saber cuándo termina una sesión?

¿Hay algún evento central que se produzca cuando finaliza una sesión? ¿Cómo puedo saber cuándo finaliza una sesión SIN (!) Llamar a un método (desconexión de la red, bloqueo del cliente, por lo que no hay una llamada al método "cerrar sesión")?

El servidor está instalado como:

[ServiceBehavior(
    InstanceContextMode = InstanceContextMode.PerSession, 
    ConcurrencyMode = ConcurrencyMode.Reentrant, 
    UseSynchronizationContext = false, 
    IncludeExceptionDetailInFaults = true 
)] 

Básicamente porque está utilizando una interfaz de devolución de llamada.

Ahora, que básicamente tienen que decoubple la instancia creada a partir de la tienda de back-end cuando la sesión termina;)

¿Alguna idea?

Respuesta

4

No es una buena descripción del contexto instancia here

contexto Instancia se deriva de CommunicationObject

Objeto de comunicación ha closing un evento.

No he hecho esto por mí mismo, pero en teoría debería ser posible utilizar este evento para desacoplar de la tienda de back-end cuando se cierre la sesión, conectando este evento.

-1

Establezca sus valores de tiempo de espera y cree un método PingService() que se active justo antes de que transcurra el tiempo de espera, esto restablecerá los tiempos de espera de envío y recepción.

si desea capturar el tiempo de espera simplemente intente una devolución de llamada, si el intento lleva más tiempo que el valor SendTimeout vinculante (predeterminado es 1 minuto, creo), lanzará un error de tiempo de espera y podrá procesar el desconectar.

No hay manera de atrapar con gracia un usuario desconectado (navegador se bloquea, se va la luz, etc., etc., etc.)

+0

mala respuesta - Ya tengo ese (ping por segundo, etc.) - no impide que un cliente se MUERDE debido a tiempo de espera en la red o pérdida de energía o algo así, y eso es exactamente lo que quiero/necesito atrapar (Es decir, necesito saber cuándo ha finalizado la conexión/la sesión ha finalizado). Tampoco hay ningún navegador involucrado (¿por qué diablos todos piensan que un servicio web es un estúpido sitio web aburrido?). Aquí no hay ningún lado del cliente involucrado, mi pregunta es 100% del lado del servidor. -1. – TomTom

+0

Puede intentar esto: callbackClient.opContext.Channel.State. – DavyMac23

8
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)] 
class MyService : IService 
{ 
    public MyService() 
    { 
     // Session opened here 
     OperationContext.Current.InstanceContext.Closed += InstanceContext_Closed; 
     // get the callback instance here if needed 
     // OperationContext.Current.GetCallbackChannel<IServiceCallback>() 
    } 

    private void InstanceContext_Closed(object sender, EventArgs e) 
    { 
     // Session closed here 
    } 
} 

El código no funcionará para Single/PerCall InstanceContextMode.

Cuestiones relacionadas