2010-02-10 8 views
5

Ich verwende eine ASP.NET-Website auf meiner Entwicklungsumgebung (.NET 2.0 unter Vista/IIS7). Die Session_Start-Methode in global.asax.cs protokolliert jeden Aufruf einer Datei (log4net). Die Session_End-Methode protokolliert auch jeden Anruf.Große Anzahl von Session_Start mit derselben Sitzungs-ID

Ich verwende den InProc-Sitzungsstatus und setze das Sitzungszeitlimit auf 5 Minuten (um Wartezeiten von 20 Minuten zu vermeiden).

Ich schlug die Website, warten Sie auf 5 Minuten Einheit Ich sehe die Session_End Protokollierung. Dann f5 ich die Webseite. Der Browser hat immer noch den Session-Cookie und sendet ihn an den Server. Session_Start wird aufgerufen und eine neue Sitzung wird mit derselben Sitzungs-ID erstellt (übrigens: Ich brauche dieselbe Sitzungs-ID, da sie zum Speichern von Daten in der Datenbank verwendet wird).

Ergebnis: Jedes Mal, wenn ich bei einer zuvor beendeten Sitzung F5 drücke, wird die Session_Start-Methode aufgerufen, die Anforderung wird ausgeführt und die Session_End-Methode wird sofort aufgerufen.

Wenn ich einen anderen Browser öffne, wird die Session_Start-Methode nur einmal aufgerufen. Nach 5 Minuten bewirkt die Session_End jedes F5, dass die Sequenz Session_Start/request/Session_End ausgeführt wird.

web.config entsprechender Bereich:

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

Ich brauche Hilfe zu diesem gleichen Problem, aber auf Websites, in denen ich nicht mit der Sitzung durcheinander gebracht habe. Völlig zufällig wird die Website eine DB-Transaktion machen, die ich in Session_Start hunderte Male pro Tag für einen Benutzer mit einer Sitzungs-ID habe. Keine Warnung, zufällige Seiten betroffen und keine Antworten. –

+0

Schauen Sie sich [diesen Link] an (http://stackoverflow.com/a/11375003/779408). Da gibt es eine echte Lösung. – breceivemail

Antwort

6

Die regenerateExpiredSessionId Einstellung bezieht dich auf cookieless URLs only, ist es nicht das Verhalten eines Session-Cookie beeinflussen, die wiederverwendet werden.

Das Problem, das auftritt, liegt an der Art und Weise, in der ASP.NET 2.0/3.5 Sitzungen behandelt, je nachdem, ob es verwendet wird. Unter normalen Umständen versucht es nicht, eine Sitzung bis zur ersten Verwendung fortzusetzen und gibt daher keinen Sitzungscookie aus (falls dieser nicht existiert). Bei der ersten Sitzung wird verwendet, eine Sitzung wird auf dem Server erstellt und ein Sitzungscookie wird ausgegeben.

Jetzt, wenn eine vorherige Sitzung neu gestartet, aber nicht verwendet wird, wird ASP.NET ein wenig verwirrt. Es versucht, die unbenutzte (neugestartete) Sitzung sofort abzubrechen, da sie nicht benötigt wird, was zu einem frühen Session_End führt. Es löscht jedoch nicht den bereits vorhandenen Sitzungscookie, und daher wiederholt jede nachfolgende Anforderung die Sequenz, startet die Sitzung neu und beendet sie dann, bis der Cookie gelöscht oder die Sitzung verwendet wird.

In .Net 4.0 dieses Verhalten hat sich geändert, und das Ereignis wird in diesem Fall nicht mehr ausgelöst.

Verwandte Themen