2010-02-10 12 views
5

Używam strony ASP.NET w moim polu rozwoju (.NET 2.0 na Vista/IIS7). Metoda Session_Start w pliku global.asax.cs rejestruje każde wywołanie do pliku (log4net). Metoda Session_End loguje również każde połączenie.Duża liczba Session_Start z tym samym identyfikatorem sesji

Używam stanu sesji InProc i ustaw limit czasu sesji na 5 minut (aby uniknąć oczekiwania przez 20 minut).

Uderzyłem się na stronę, poczekam na 5 minutową jednostkę Widzę logowanie Session_End. Potem I F5 na stronie internetowej. Przeglądarki nadal mają plik cookie sesji i wysyła go na serwer. Funkcja Session_Start jest wywoływana, a nowa sesja jest tworzona przy użyciu tego samego identyfikatora sesji (btw: Potrzebuję tego samego identyfikatora sesji, ponieważ jest on używany do przechowywania danych w bazie danych).

Wynik: Za każdym razem, gdy wciskam F5 do poprzednio zakończonej sesji, wywoływana jest metoda Session_Start, żądanie jest wykonywane, a metoda Session_End jest wywoływana natychmiast.

Po uruchomieniu innej przeglądarki metoda Session_Start jest wywoływana tylko raz. Następnie po 5 minutach Session_End każdy F5 powoduje wykonanie sekwencji Session_Start/request/Session_End.

web.config odpowiedniej sekcji:

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

Potrzebuję pomocy w tym samym problemie, ale na stronach, na których nie zepsułem sesji. Zupełnie losowo witryna wykona transakcję DB, którą mam w Session_Start setki razy dziennie dla jednego użytkownika z jednym identyfikatorem sesji. Brak ostrzeżeń, przypadkowe strony dotknięte problemem i brak odpowiedzi. –

+0

Spójrz na [ten link] (http://stackoverflow.com/a/11375003/779408). Tam jest prawdziwe rozwiązanie. – breceivemail

Odpowiedz

6

Ustawienie regenerateExpiredSessionId dotyczy cookieless URLs only, to nie ma wpływu na zachowanie cookie sesji, które zostaną ponownie wykorzystane.

Wystąpił problem z powodu sposobu, w jaki program ASP.NET 2.0/3.5 obsługuje sesje w zależności od tego, czy jest używany. W normalnych okolicznościach nie próbuje utrzymywać sesji do czasu jej pierwszego użycia i dlatego nie wydaje pliku cookie sesji (jeśli nie istnieje). Sesja po raz pierwszy używana jest jako, sesja jest tworzona na serwerze i wydawany jest plik cookie sesji.

Teraz, gdy poprzednia sesja została zrestartowana, ale nie jest używana, program ASP.NET jest trochę zdezorientowany. Próbuje od razu zrezygnować z nieużywanej (zrestartowanej) sesji, ponieważ nie jest to wymagane, co podnosi wczesny Session_End. Jednak nie usuwa on już istniejącego pliku cookie sesji, a zatem każde kolejne żądanie powtarza sekwencję, restartując, a następnie kończąc sesję, dopóki plik cookie nie zostanie usunięty lub sesja zostanie użyta.

To zachowanie się zmieniło w .Net 4.0, a zdarzenie nie jest już w tym przypadku uruchamiane.