Pola statyczne a zmienne sesji
Do tej pory używałem sesji do przekazywania niektórych zmiennych z jednej strony na drugą. Na przykład rola użytkownika. Gdy użytkownik loguje się do aplikacji webowej, identyfikator roli użytkownika jest przechowywany w sesji i ta rola jest sprawdzana w różnych częściach aplikacji. Ostatnio zacząłem myśleć, dlaczego nie używać static members zamiast. Mogę przechowywać te same informacje w polu statycznym i łatwo uzyskać do nich dostęp w dowolnym miejscu w mojej aplikacji (w dowolnym miejscu przestrzeń nazw, w której znajduje się to pole statyczne wliczony w cenę.) Wiem, że używanie zmiennych sesji czasem się przydaje, np.:
- każdy rodzaj danych może być przechowywany w sesji. Następnie należy go jednak odlewać.Ale pola statyczne akceptują dane tylko z prawidłowym typem danych.
- zmienne sesji wygasną po pewnym czasie, czego w wielu przypadkach potrzebujemy.
Poza powyższym, czy są inne powody, dla których nie powinienem używać statycznych pól do przechowywania danych i mieć je dostępne wszędzie?
4 answers
Nie, używanie zmiennych statycznych do tego celu jest , a nie Droga do zrobienia:
- Jeśli Twoja AppDomain zostanie poddana recyklingowi, wszystkie zmienne statyczne zostaną "zresetowane"
- zmienne statyczne nie skalują się poziomo - jeśli załadujesz-zrównoważysz aplikację, użytkownik, który uderzy na jeden serwer, a inny nie zobaczy przechowywanych danych w zmiennych statycznych na pierwszym serwerze
- co najważniejsze, zmienne statyczne będą współdzielone przez cały dostęp do tego serwera... nie będzie na w ogóle na użytkownika... natomiast z twojego opisu nie chciałbyś, aby użytkownik X widział informacje użytkownika Y.
Zasadniczo masz dwie możliwości propagowania informacji wokół swojej aplikacji:
- zachowaj to po stronie klienta, więc każde żądanie podaje informacje z poprzednich kroków. (Może to stać się nieporęczne z dużą ilością informacji, ale może być przydatne w prostych przypadkach.)
- zachować po stronie serwera, najlepiej w jakiś trwały sposób (np. bazy danych) z podaniem przez Klienta identyfikatora sesji.
Jeśli możesz użyć load-balancing, aby utrzymać wszystkich użytkowników na tym samym serwerze, i Jeśli {[2] } nie przeszkadza ci utrata sesji, gdy AppDomain jest odzyskiwany1 lub serwer się wyłącza, można go zachować w pamięci, keyed przez identyfikator sesji... ale bądź ostrożny.
1 mogą istnieć mechanizmy w ASP.NET aby to przetrwać, propagując informacje o sesji z jednego AppDomain do drugiego-jestem Nie wiem
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-02-05 09:22:45
To dwie różne rzeczy.
- sesja może być używana poza procesem (ważne dla równoważenia obciążenia)
- sesja może być trwalsza ze względu na brak możliwości procesowych.
- ASP.Net automatycznie zarządza współbieżnością sesji.
- Dostęp do zmiennych statycznych wymaga ręcznej synchronizacji.
- Static jest globalny dla całej domeny aplikacji. Jeśli ustawisz wartość statycznego pola / właściwości dla jednego użytkownika, wszyscy użytkownicy otrzymają to samo wartość. Nie pożądane zachowanie w Twoim scenariuszu.
Każdy rodzaj danych może być przechowywany w sesji. Następnie należy go odlewać jednak.Ale pola statyczne akceptują dane tylko z prawidłowym typem danych.
Często pomocne jest abstrakcyjne wartości sesji z klasą pomocniczą. Może to poprawić testowalność, a także pozwala silnie wpisywać właściwości i wykonywać odlewy we wnętrzach klasy.
Przykład:
public List<int> UserRoles
{
get
{
// optionally check that the value is indeed in session, otherwise this
// will throw
return (List<int>)Session["UserRoles"];
}
}
Zobacz:
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-23 12:17:17
Zapominasz o jednej rzeczy (myślę)
Dane statyczne będą takie same dla wszystkich użytkowników aplikacji, podczas gdy sesja będzie "na użytkownika".
Więc za scenariusz "roli użytkownika" spodziewałbym się śmiesznych efektów;)
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-02-06 07:12:17
Statyczne pola będą współdzielone przez wszystkich użytkowników.
W as web environment będziesz miał kilka wątków działających razem.
Aktualizacja statycznych elementów wymaga odpowiedniej kontroli współbieżności. Źle wykonane, znacznie spowolni to wydajność witryny.
Sesje można przenieść poza proces i udostępnić na farmie internetowej.
Out of proc sessions would exist even if your app server crashed.
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-02-06 07:12:54