2011-01-27 26 views
22

Quiero desconectarme de un usuario cuando su sesión expira. Así utilizados siguiendo el código en el Global.asax:Session_End no se activa?

protected void Session_End(object sender, EventArgs e) 
{ 
    FormsAuthentication.SignOut(); 
} 

Pero parece session_end nunca se dispara. Alguna idea de como puede arreglarlo? Estoy usando ASP.NET con la configuración predeterminada.

+3

¿Realmente esperar 20 minutos para que al evento para disparar? – leppie

+0

@leppie: definitivamente sí! También reemplacé esa línea con esto: "lanzar nueva excepción (" ");" pero todavía no funciona. –

+0

@InSane: ¿Cómo se puede asegurar esto? Sé que mi sesión realmente expira después de un tiempo específico. Parece que es InProc –

Respuesta

34

Usted puede establecer algunos datos de sesión en Session_Start. Sin esto, Session_End no se disparará. ver this

También otra cosa muy importante tener en cuenta aquí es que si no guarda nada en la sesión del evento Session_End no se disparará. Debe haber algo guardado en la sesión al menos una vez para que se active el evento Session_End. Esto también significa que si guarda algo en la sesión en la primera solicitud y abandona la sesión en la misma solicitud, el evento Sesison_End no se activará, ya que no se guardó nada en la sesión.

+4

Esta debería ser la respuesta aceptada –

+0

Muy interesante; algo que no sabía. También tiene mucho sentido. En mi humilde opinión, esta es la respuesta. – nocarrier

+0

Estoy de acuerdo con Dubya. –

1

¿Estás seguro de que nunca se dispara?

Según tengo entendido, Session_End no tiene nada que ver con la solicitud actual porque la sesión de ASP.NET se termina por el tiempo de espera DESPUÉS de que ha llegado la última solicitud del cliente. La llamada al FormsAuthenticaion.SignOut manipula las cookies de autenticación y, por lo tanto, no tiene ningún efecto sin ninguna conectividad del cliente (navegador).

Tome un vistazo a esta pregunta (que tiene una respuesta) - el problema es más o menos similar a la suya por lo que podría encontrar una solución adecuada:

Session_End in Global.asax.cs not firing using forms authentication

Espero que esto ayude.

5

En su web.config es necesario tener el elemento sessionState como un hijo del elemento

<configuration> 
    <system.web> 
      <sessionState mode="InProc" /> 
      ..... 
    </system.web> 
</configuration> 
+1

. Tampoco vale la pena que Session_End NO funcione con ningún sessionState que no sea InProc. – Phill

+0

Cambié la sesión a InProc. Pero session_end aún no se activa. –

+3

¿Está ejecutando esto en IIS o en Visual Studio? Si está en VisualStudio con WebDev, entonces no verá el desencadenador del evento. Para probarlo, deberá colocar su sitio web en IIS y conectar el depurador a w3wp.exe – Phill

5

No sé, ¿es función o error. O puede ser que no entiendo suficiente gestión de sesiones en ASP.NET. Pero esto es lo que encontré.

Session_End no se activa en ASP.NET MVC 4 (con la configuración predeterminada para el elemento sessionState en web.config) si Session_Start no se declara.

por lo que necesita declarar Session_Start para atrapar Session_End :)

protected void Session_Start(Object sender, EventArgs e) { } 

protected void Session_End(Object sender, EventArgs e) { 
    Debug.WriteLine("End. " + Session.SessionID); 
} 
+1

Gracias por esto. –

0

No sé cómo funciona, pero se disparará cuando cierro el navegador después del tiempo de espera.

public void Session_End(Object sender, SessionEndedEventArgs e) 
    { 
    } 

Call esto desde

Application_Start() Event 

    SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End); 
Cuestiones relacionadas