2010-03-29 4 views

Odpowiedz

3

Nie zgadzam się z Darinem. Wywołuję funkcję w Session_End, aby zarejestrować koniec sesji. Nie testowałem tego wyraźnie, ale w moich dziennikach sprawdzałem kilka razy, że pula aplikacji została poddana recyklingowi. Funkcja została wywołana, a koniec aktywnych sesji został zarejestrowany.

Wystąpiło to zarówno po zreinstalowaniu puli aplikacji zgodnie z harmonogramem, jak i po jej przetworzeniu, ponieważ wdrożyłem kilka nowych bibliotek dll.

+0

Uzgodnione, po prostu przetestowane i uruchomione :-) –

1

Jeśli dobrze pamiętam (od jakiegoś czasu czytałem dokumenty), aktywne sesje spowodują opóźnienie normalnego czasu regeneracji puli aplikacji (która zostanie uruchomiona, gdy zasoby powinny zostać zwolnione), ponieważ serwer aktywuje aktywne sesje, co oznacza, że ​​istnieje ciągła potrzeba. Po wygaśnięciu sesji (i wystrzeleniu zdarzenia session_end) licznik czasu na ponowne uruchomienie aplikacji rozpoczyna się i odlicza, a następnie uruchamia się, zanim pula wątków zwalnia własne zasoby i kończy aplikację.

To jest w normalnych warunkach, należy zauważyć, że event session_end nie jest gwarantowany do ognia (nie ma konkretnych scenariuszy, gdzie nie byłoby), myślę, że teraz jest to głównie związane ze zderzeniami wystąpień IIS lub Pula aplikacji przetwarza OOM lub błędy. Używałoby się tak, chyba że używasz tylko jednego z typów sesji (jak sądzę, serwer stanu), który nie zostałby rzucony niezawodnie. To może być teraz inne.

Jeśli chcesz zagwarantować, że zasoby zostały zwolnione, nie jestem pewien, czy session_end jest odpowiednim miejscem do tego. Czy możesz podnieść go do pamięci podręcznej aplikacji lub pamięci podręcznej HTTP i używać unikalnych kluczy sesji z okresowymi zdarzeniami porządkowymi? To może być bardziej niezawodne (więcej kodu), ale bardziej niezawodne.

To było moje ogólne doświadczenie, że session_end wystrzeliwuje dość niezawodnie, ale widziałem, że nie działa pod dużym obciążeniem (100 sekund trafienia na sekundę) i wiem, że kiedy zaczynasz mówić o farmach serwerów, staje się on również znacznie bardziej skomplikowany.

+0

Mówię tylko o 20-30 użytkownikach max, ale koszt pozostawienia otwartego połączenia jest bardzo wysoki i nie ufam, że zdalny serwer go zamknie. –

1

Należy również zauważyć, że Session_End jest wywoływana tylko wtedy, gdy używasz trybu sesji Inproc. W przypadku innych trybów (w tym trybu stanu sesji SQL) wydarzenie to nigdy nie zostanie podniesione.

Powiązane problemy