2010-02-10 3 views
5

Je cours 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 consigne chaque appel dans un fichier (log4net). La méthode Session_End enregistre également tous les appels. J'utilise l'état de session InProc et définissez le délai d'expiration de la session à 5 minutes (pour éviter d'attendre 20 minutes). J'ai frappé le site Web, attendez 5 minutes unité Je vois la journalisation Session_End. Ensuite, je F5 le site Web. Les navigateurs ont toujours le cookie de session et l'envoient 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).Grand nombre de Session_Start avec l'ID de la même session

Résultat: Chaque fois que j'appuie sur F5 lors d'une session précédemment terminée, 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.

Lorsque j'ouvre un navigateur différent, la méthode Session_Start est appelée une seule fois. Puis, après 5 minutes, Session_End chaque F5 provoque l'exécution de la séquence Session_Start/request/Session_End.

web.config section pertinente:

<system.web> 
    <compilation debug="true" /> 
    <sessionState timeout="2" regenerateExpiredSessionId="false" /> 
</system.web> 
+0

J'ai besoin d'aide sur ce même problème, mais sur des sites dans lesquels je n'ai pas joué avec la session. Complètement au hasard le site fera une transaction DB que j'ai dans Session_Start des centaines de fois par jour pour un utilisateur avec un ID de session. Aucun avertissement, sites aléatoires affectés, et pas de réponses. –

+0

Regardez [ce lien] (http://stackoverflow.com/a/11375003/779408). Il y a une vraie solution là-bas. – breceivemail

Répondre

6

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

Le problème que vous rencontrez est lié à la manière dont ASP.NET 2.0/3.5 gère les sessions en fonction de leur utilisation. Dans des circonstances normales, il n'essaie pas de persister une session jusqu'à la première fois qu'il est utilisé et n'émet donc pas de cookie de session (s'il n'existe pas). La première session est utilisée, une session est créée sur le serveur et un cookie de session est émis.

Maintenant, lorsqu'une session précédente est redémarrée mais pas utilisée, ASP.NET devient un peu confus. Il essaie d'abandonner la session inutilisée (redémarrée) immédiatement car elle n'est pas requise, ce qui déclenche un début Session_End. Toutefois, il ne supprime pas le cookie de session préexistant et, par conséquent, chaque requête suivante répète la séquence, redémarre et termine la session jusqu'à ce que le cookie soit supprimé ou que la session soit utilisée.

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

Questions connexes