2010-02-10 20 views
5

Sto eseguendo un sito Web ASP.NET sulla mia casella di sviluppo (.NET 2.0 su Vista/IIS7). Il metodo Session_Start in global.asax.cs registra ogni chiamata a un file (log4net). Il metodo Session_End registra anche ogni chiamata.Gran numero di Session_Start con lo stesso ID di sessione

Utilizzo lo stato di sessione InProc e imposta il timeout della sessione su 5 minuti (per evitare l'attesa di 20 minuti).

Ho colpito il sito Web, attendo 5 minuti. Vedo la registrazione Session_End. Allora F5 il sito web. Il browser ha ancora il cookie di sessione e lo invia al server. Session_Start viene chiamato e viene creata una nuova sessione utilizzando lo stesso ID di sessione (btw: ho bisogno che questo sia lo stesso ID di sessione, perché è usato per memorizzare i dati nel database).

Risultato: Ogni volta che si preme F5 in una sessione precedentemente terminata, viene chiamato il metodo Session_Start, la richiesta viene eseguita e il metodo Session_End viene chiamato immediatamente.

Quando si apre un browser diverso, il metodo Session_Start viene chiamato una sola volta. Quindi, dopo 5 minuti, la Session_End ogni F5 causa la sequenza Session_Start/request/Session_End da eseguire.

web.config sezione pertinente:

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

Ho bisogno di aiuto su questo stesso problema, ma su siti in cui non ho avuto problemi con la sessione. Completamente a caso il sito effettuerà una transazione DB che ho in Session_Start centinaia di volte al giorno per un utente con un ID di sessione. Nessun avviso, siti casuali interessati e nessuna risposta. –

+0

Guarda [questo link] (http://stackoverflow.com/a/11375003/779408). C'è una soluzione reale lì. – breceivemail

risposta

6

L'impostazione regenerateExpiredSessionId riferisce ad cookieless URLs only, non influisce sul comportamento di un cookie di sessione che verrà riutilizzata.

Il problema riscontrato dipende dal modo in cui ASP.NET 2.0/3.5 gestisce le sessioni in base al fatto che sia in uso. In circostanze normali non tenta di mantenere una sessione fino a quando non viene utilizzata per la prima volta e quindi non emette un cookie di sessione (se non esiste). La prima sessione di tempo è utilizzata, una sessione viene creata sul server e un cookie di sessione rilasciato.

Ora quando una sessione precedente viene riavviata ma non utilizzata, ASP.NET diventa un po 'confuso. Prova ad abbandonare immediatamente la sessione inutilizzata (riavviata) poiché non è necessaria, il che solleva un Session_End iniziale. Tuttavia, non elimina il cookie di sessione preesistente e quindi ogni richiesta successiva ripete la sequenza, riavvia e termina la sessione fino a quando il cookie non viene eliminato o la sessione viene utilizzata.

In .Net 4.0 questo comportamento è cambiato e l'evento non viene più attivato in questo caso.

Problemi correlati