W mojej aplikacji internetowej robię coś takiego, aby odczytać zmienne sesji:
if (HttpContext.Current.Session != null && HttpContext.Current.Session["MyVariable"] != null)
{
string myVariable= (string)HttpContext.Current.Session["MyVariable"];
}
Rozumiem, dlaczego ważne jest, aby sprawdzić, dlaczego HttpContext.Current.Session ["MyVariable"] ma wartość null (zmienna mogła nie zostać jeszcze zapisana w sesji lub sesja została zresetowana z różnych powodów), ale dlaczego muszę to sprawdzić jeśli HttpContext.Current.Session
jest null?
Rozumiem, że sesja jest tworzona automatycznie przez ASP.NET, dlatego HttpContext.Current.Session nigdy nie powinna mieć wartości null. Czy to założenie jest słuszne? Jeśli może być zerowe, czy to znaczy, że powinienem to sprawdzić przed zapisaniem czegoś w nim:
if (HttpContext.Current.Session != null)
{
HttpContext.Current.Session["MyVariable"]="Test";
}
else
{
// What should be done in this case (if session is null)?
// Is it possible to force the session to be created if it doesn't exist?
}
Odpowiedzi:
Tak, obiekt Session może mieć wartość null, ale tylko w pewnych okolicznościach, z którymi będziesz się rzadko spotykać:
Jeśli masz kod tylko na stronach, nie napotkasz tego. Większość mojego kodu ASP .NET używa sesji bez wielokrotnego sprawdzania wartości null. Jest to jednak coś, o czym należy pomyśleć, jeśli tworzysz IHttpModule lub w inny sposób nie znasz bardziej szczegółowych informacji o ASP .NET.
Edytować
W odpowiedzi na komentarz: To, czy stan sesji jest dostępny, zależy od tego, czy zdarzenie AcquireRequestState zostało uruchomione dla żądania. W tym miejscu działa moduł stanu sesji, odczytując plik cookie sesji i znajdując dla Ciebie odpowiedni zestaw zmiennych sesji.
AcquireRequestState jest uruchamiany przed przekazaniem kontroli do strony. Więc jeśli wywołujesz inne funkcje, w tym klasy statyczne, ze swojej strony, wszystko powinno być w porządku.
Jeśli niektóre klasy wykonują logikę inicjowania podczas uruchamiania, na przykład w zdarzeniu Application_Start lub przy użyciu konstruktora statycznego, stan sesji może być niedostępny. Wszystko sprowadza się do tego, czy istnieje aktualne żądanie i czy AcquireRequestState zostało uruchomione.
Ponadto, jeśli klient wyłączył pliki cookie, obiekt Session będzie nadal dostępny - ale przy następnym żądaniu użytkownik powróci z nową, pustą sesją. Dzieje się tak, ponieważ klient otrzymuje pakiet stanu sesji, jeśli jeszcze go nie ma. Jeśli klient nie prześle pliku cookie sesji, nie mamy możliwości zidentyfikowania klienta jako takiego samego, więc będzie otrzymywał ciągle nową sesję.
źródło
HttpContext.Current.Session
może mieć wartość zerową w kodzie w `Application_AcquireRequestState '. Żądanie samej strony powoduje jednak, że obiekt sesji jest tam dostępny do kodowania. Jest to przynajmniej w MVC.NET 4.Poniższe stwierdzenie nie jest całkowicie poprawne:
Wzywam metodę statyczną, która odwołuje się do sesji za pośrednictwem HttpContext.Current.Session i jest null. Jednak wywołuję metodę za pośrednictwem metody usługi sieciowej za pośrednictwem AJAX przy użyciu jQuery.
Jak dowiedziałem się tutaj , możesz rozwiązać problem za pomocą prostego atrybutu w metodzie lub użyć obiektu sesji usługi sieciowej:
Podziękowania dla Matthew Coziera za rozwiązanie.
Pomyślałem, że dodam moje dwa centy.
Ed
źródło
the default value is false
. Działa jak marzenie.Jeśli Twoja instancja Session ma wartość null, a znajdujesz się w pliku „ashx”, po prostu zaimplementuj interfejs „IRequiresSessionState”.
Ten interfejs nie ma żadnych członków, więc wystarczy dodać nazwę interfejsu po deklaracji klasy (C #):
źródło
Artykuły techniczne dotyczące platformy ASP.NET
EDYTOWAĆ:
Sesja: koncepcja dla początkujących
źródło
W moim przypadku
ASP.NET State Service
został zatrzymany. ZmianaStartup type
doAutomatic
i ręcznego uruchamiania usługi po raz pierwszy rozwiązany problem.źródło