Utrata Stanu Sesji

Mam ASP.net aplikacja, w której użytkownicy nie są w stanie pomyślnie wykonać pewnych działań, z powodów, jak zakładam, może być związana tylko z utratą sesji (czyli gdzie przechowuję ich bieżące informacje o użytkowniku i jak określić, czy są zalogowani)

Nie wiem, dlaczego przegrali sesję, więc moje pierwsze pytanie brzmi:

Co (ogólnie) spowodowałoby utratę sesji użytkownika w ASP.net?

A skoro Nie wiem kiedy użytkownik traci swoją sesję i nie może jej sam odtworzyć:

Jak mogę śledzić, gdy użytkownik traci swoją sesję

Poniżej znajduje się moja konfiguracja sessionState dla odniesienia

<sessionState
           mode="InProc"
           cookieless="false"
           cookieName="My.Site.Com"
           timeout="480"/>
Author: Adam Ritenauer, 2010-08-18

7 answers

Wiele rzeczy może spowodować tajemnicze zniknięcie stanu sesji.

  1. twój limit czasu sesji wygasł
  2. aktualizujesz swoją sieć.config lub inny typ pliku, który powoduje recykling AppDomain
  3. Twój Appool w IIS przetwarza
  4. aktualizujesz swoją witrynę z dużą ilością plików, a ASP.NET proaktywnie niszczy AppDomain w celu rekompilacji i zachowania pamięci.

-

Jeśli używasz IIS 7 lub 7.5, oto kilka rzeczy, aby spojrzeć za:

  1. domyślnie program IIS ustawia, aby AppPools wyłączył się po okresie nieaktywności.
  2. Domyślnie IIS ustawia AppPools do recyklingu co 1740 minut (oczywiście w zależności od konfiguracji głównej, ale to jest domyślne)
  3. w IIS sprawdź "ustawienia zaawansowane" swojego AppPool. Znajduje się tam nieruchomość o nazwie "bezczynność". Ustaw to na zero lub na wyższą liczbę niż domyślna (20).
  4. w programie IIS sprawdź ustawienia "Recykling" w swoim AppPool. Proszę. możesz włączyć lub wyłączyć swój AppPool z recyklingu. Druga strona kreatora to sposób na zalogowanie się do dziennika zdarzeń każdego typu aplikacji.

Jeśli używasz IIS 6, obowiązują te same ustawienia (w większości przypadków, ale z różnymi sposobami dotarcia do nich), jednak uzyskanie ich do logowania recyklerów jest bardziej bolesne. Oto link do sposobu, w jaki IIS 6 rejestruje zdarzenia recyklingu aplikacji Appool:

Http://web.archive.org/web/20100803114054/http://surrealization.com/sample-code/getnotifiedwhenapppoolrecycles/

-

Jeśli aktualizujesz pliki w aplikacji internetowej, powinieneś oczekiwać utraty całej sesji. Taka jest natura bestii. Możesz jednak nie oczekiwać, że stanie się to wiele razy. Jeśli zaktualizujesz 15 lub więcej plików (aspx, dll, itp.), istnieje prawdopodobieństwo, że będziesz miał wiele restartów w danym okresie czasu, ponieważ te strony są rekompilowane przez użytkowników uzyskujących dostęp do witryny. Zobacz te dwa linki:

Http://support.microsoft.com/kb/319947

Http://msdn.microsoft.com/en-us/library/system.web.configuration.compilationsection.numrecompilesbeforeapprestart.aspx

Ustawienie numCompilesBeforeAppRestart na wyższą liczbę (lub ręczne odbijanie aplikacji) wyeliminuje ten problem.

-

Zawsze możesz obsłużyć Application_SessionStart i Application_SessionEnd Powiadamianie o utworzeniu lub zakończeniu sesji. Klasa HttpSessionState ma również właściwość IsNewSession , którą możesz sprawdzić na dowolnym żądaniu strony, aby określić, czy nowa sesja jest utworzona dla aktywnego użytkownika.

-

Wreszcie, jeśli jest to możliwe w Twoich okolicznościach, użyłem SQL Server session mode Z dobrym sukcesem. Nie jest to zalecane, jeśli przechowujesz w nim dużą ilość danych (każde żądanie ładuje i zapisuje pełną ilość danych z SQL Serwer) i może to być ból, jeśli umieszczasz w nim niestandardowe obiekty (ponieważ muszą być serializowalne), ale pomogło mi to w scenariuszu współdzielonego hostingu, w którym nie mogłem skonfigurować mojego Appool, aby nie przetwarzać kilku godzin. W moim przypadku przechowywałem ograniczone informacje i nie miało to negatywnego wpływu na wydajność. Dodać do tego fakt, że istniejący użytkownik będzie ponownie używać ich SessionID domyślnie i moi użytkownicy nigdy nie zauważył fakt, że ich sesja w pamięci został usunięty przez AppPool recyklingu, ponieważ wszystkie ich stan został zapisany w SQL Server.

 102
Author: Adam Sills,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-07 18:19:00

Miałem sytuację w ASP.NET 4.0 gdzie moja sesja byłaby resetowana na każdym żądaniu strony (a mój kod SESSION_START byłby uruchamiany na każdym żądaniu strony). Nie zdarzyło się to każdemu użytkownikowi w każdej sesji, ale zwykle tak się stało, a kiedy tak się stało, działo się to na każdym żądaniu strony.

Moja sieć.znacznik config sessionState miał takie samo ustawienie jak wspomniany powyżej.

cookieless="false"

Kiedy zmieniłem go na następujący...

cookieless="UseCookies"

... problem zdawał się znikać. Pozornie prawda|fałsz były stare wybory z ASP.NET 1. Począwszy od ASP.Net 2.0. wyliczone wybory zaczęły być dostępne. Myślę, że te opcje były przestarzałe. Wartość "false" nigdy nie przedstawiała problemu w przeszłości-zauważyłem tylko w na ASP.NET 4.0. Nie wiem, czy coś się zmieniło w 4.0, że nie obsługuje już poprawnie.

/ Align = "left" / Ponieważ problem był przerywany wcześniej, przypuszczam, że nadal mogę go napotkać, ale do tej pory działa z tym nowym ustawieniem.
 2
Author: Rick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-16 19:52:38

Twoja sesja jest stracona becoz....

Znalazłem scenariusz, w którym sesja jest stracona - w asp.net strona, dla pola tekstowego kwota ma nieprawidłowe znaki, a następnie zmienna sesji pobieranie w innym celu.Po wysłaniu nieprawidłowego numeru parsującego przez konwerter.ToInt32 lub double podnosi wyjątek pierwszej szansy, ale błąd nie pojawia się w tej linii, zamiast tego, sesja jest null z powodu nieobsługiwanego wyjątku, pokazuje błąd podczas pobierania sesji, w ten sposób oszukując debugowanie...

Podpowiedź: Przetestuj swój system, aby go zawieść-destrukcyjne.. wprowadź wystarczającą ilość śmieci w scenariuszach niepowiązanych dla ex: po wyświetleniu wyników wyszukiwania wprowadź śmieci w kryteriach wyszukiwania i goto szczegóły wyniku wyszukiwania... , będziesz w stanie odtworzyć tę maszynę na swojej bazie lokalnego kodu...:)

Hope it Helps, hydtechie

 1
Author: HydTechie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-11 13:54:03

W moim przypadku ustawienie AppPool->AdvancedSettings- > Maximum Worker Proccesses to 1 pomógł.

 1
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 12:07:17

Możesz dodać trochę logowania do globalnego.asax w Session_Start i Application_Start, aby śledzić, co dzieje się z sesją użytkownika i aplikacją jako całością.

Uważaj również na to, że działasz w trybie Web Farm (wiele wątków IIS zdefiniowanych w puli aplikacji) lub równoważenia obciążenia, ponieważ użytkownik może trafić na inny serwer, który nie ma tej samej pamięci. W takim przypadku można przełączyć tryb sesji na SQL Server.

 0
Author: Jemes,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-18 19:40:43

Traciłem tylko sesję, która nie była ciągiem lub liczbą całkowitą, ale datarem. Umieszczenie danych w obiekcie serializowalnym i zapisanie ich w sesji zadziałało.

 0
Author: Gert R.,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-11 09:57:45

Miałem problem na IIS 8 podczas pobierania zawartości przez Ajax. Problem polegał na tym, że MaximumWorkerProcesses został ustawiony na 2 i Javascript otworzył 17 jednoczesnych żądań. To było więcej niż AppPool mógł obsłużyć i nowa pula (bez auth-data) został otwarty.

Rozwiązanie polegało na zmianie MaximumWorkerProcesses na 0 w IIS -> Server -> Application Pools -> [myPool] -> Advanced Settings -> Process Model -> MaximumWorkerProcesses.

 0
Author: Martin Seitl,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-19 14:48:20