Question

Je suis en cours d'exécution d'un site Web ASP.NET sur ma boîte de développement (.NET 2.0 sur Vista / IIS7). La méthode Session_Start dans Global.asax.cs enregistre tous les appels à un fichier (log4net). La méthode Session_End enregistre également chaque appel.

J'utilise l'état de session InProc et définir le délai d'attente de session à 5 minutes (pour éviter d'attendre pendant 20 minutes).

Je frappé le site, attendre 5 minutes que je vois unité l'enregistrement Session_End. Ensuite, je F5 le site. Les navigateurs a toujours le cookie de session et l'envoie au serveur. Session_Start est appelée et une nouvelle session est créée en utilisant le même identifiant de session. (BTW: J'ai besoin que ce soit le même identifiant de session, car il est utilisé pour stocker des données dans la base de données)

Résultat: Chaque fois que je frappe F5 sur une session terminée précédemment, la méthode Session_Start est appelée, la requête est exécutée et la méthode Session_End est appelée immédiatement.

Quand j'ouvre un autre navigateur, la méthode Session_Start est appelée une seule fois. Puis au bout de 5 minutes, le Session_End chaque F5 provoque la Session_Start / demande / Session_End séquence à exécuter.

web.config section pertinente:

<system.web>
  <compilation debug="true" />
  <sessionState timeout="2" regenerateExpiredSessionId="false" />
</system.web>
Était-ce utile?

La solution

Le réglage regenerateExpiredSessionId concerne URL seulement cookieless , il ne modifie pas le comportement d'un cookie de session qui sera réutilisée.

Le problème que vous rencontrez est à cause de la façon dont ASP.NET 2.0 gère / 3.5 sessions basées sur que ce soit en cours d'utilisation. Dans des circonstances normales, il ne cherche pas à persister une session jusqu'à ce que la première fois qu'il est utilisé et donc ne délivre pas un cookie de session (si elle n'existe pas). La première session de temps est utilisé, une session est créée sur le serveur et un cookie de session émis.

lorsqu'une session précédente est redémarré mais pas utilisé, ASP.NET est un peu confus. Il essaie d'abandonner la session inutilisée (redémarré) immédiatement car il n'est pas nécessaire, ce qui pose un début Session_End. Toutefois, il ne supprime pas le cookie de session pré-existante, et donc chaque requête répète la séquence, le redémarrage, puis terminer la session jusqu'à ce que le cookie est supprimé ou la session est utilisée.

Dans .Net 4.0 ce comportement a changé, et l'événement ne tire plus dans ce cas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top