web-dev-qa-db-fra.com

Session_End ne se déclenche pas?

Je souhaite déconnecter un utilisateur lorsque sa session expire. Donc utilisé le code suivant dans Global.asax:

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

Mais semble que session_end ne se déclenche jamais. Une idée de comment résoudre ce problème? J'utilise ASP.NET avec les paramètres par défaut. 

23
Afshar Mohebbi

Vous pouvez définir des données de session dans Session_Start. Sans cela, Session_End ne sera pas déclenché . Voir this

Une autre chose très importante à noter ici est que si vous ne sauvegardez rien dans la session, l'événement Session_End ne se déclenchera pas. Il doit y avoir au moins une chose enregistrée dans la session pour que l'événement Session_End soit déclenché. Cela signifie également que si vous enregistrez quelque chose dans la session lors de la première demande et que vous abandonnez la session dans la même demande, l'événement Sesison_End ne se déclenchera pas, car rien n'a été enregistré dans la session.

40
polach.o

Dans votre configuration web, vous devez avoir l'élément sessionState en tant qu'enfant de l'élément.

<configuration>
     <system.web>
          <sessionState mode="InProc" />
          .....
     </system.web>
</configuration>
5
TheGeekYouNeed

Je ne sais pas si c'est une fonctionnalité ou un bug. Ou peut-être que je ne comprends pas assez la gestion de session dans ASP.NET. Mais c'est ce que j'ai trouvé.

Session_End ne se déclenche pas dans ASP.NET MVC 4 (avec les paramètres par défaut pour l'élément sessionState dans web.config) si Session_Start n'est pas déclaré.

Vous devez donc déclarer Session_Start pour intercepter Session_End :)

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

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

Êtes-vous sûr qu'il ne se déclenche jamais?

Si j'ai bien compris, Session_End n'a rien à voir avec la demande en cours car la session ASP.NET est terminée par le délai d'attente APRÈS la dernière demande du client. L'appel à FormsAuthenticaion.SignOut manipule les cookies d'authentification et n'a donc aucun effet sans connectivité du client (navigateur). 

Jetez un oeil à cette question (qui a une réponse) - le problème est plus ou moins similaire au vôtre, vous pouvez donc trouver la bonne solution:

Session_End dans Global.asax.cs ne se déclenche pas à l'aide de l'authentification par formulaire

J'espère que cela t'aides.

1
volpav

Je ne sais pas comment ça marche, mais il se déclenchera lorsque je fermerai mon navigateur après une période d'inactivité. 

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

Appelez ceci de 

  Application_Start() Event

  SessionEndModule.SessionEnd += new SessionEndEventHandler(Session_End);
0
Haris