2009-09-05 18 views
104

W mojej aplikacji internetowej, robię coś takiego czytać zmienne sesji:Co należy zrobić, jeśli bieżąca sesja ASP.NET ma wartość zerową?

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 nie może zostały zapisane w sesji jeszcze lub sesja została zresetowana z różnych powodów), ale dlaczego muszę sprawdzić, czy HttpContext.Current.Session ma wartość null?

Moje zrozumienie jest, że sesja jest tworzona automatycznie przez ASP.NET dlatego HttpContext.Current.Session nigdy nie powinien być zerowy. Czy to założenie jest poprawne? Jeśli może być null, to znaczy powinien również sprawdzić go 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? 
} 
+0

ASP.NET WebAPI będzie mieć zróżnicowanego zachowania, można sprawdzić to na [Wejście Session Korzystanie ASP.NET Web API] (http://stackoverflow.com/questions/9594229/accessing-session-using -asp-net-web-api? answerertab = głosy # tab-top) –

Odpowiedz

135

Tak , Obiekt Session może mieć wartość NULL, ale tylko w pewnych okolicznościach, które yo u będzie tylko rzadko napotkasz:

Jeśli masz tylko kod na stronach, nie natkniesz się na to. Większość mojego kodu ASP .NET używa Sesji bez sprawdzania zerowej wartości. Jest to jednak coś, o czym warto pomyśleć, jeśli opracowujesz moduł IHttpModule lub w inny sposób znajduje się on w bardziej groteskowych szczegółach ASP .NET.

Edit

W odpowiedzi na komentarz: To, czy stan sesji jest dostępna w zależności od tego, czy zdarzenie AcquireRequestState prowadzi do wniosku. W tym miejscu działa moduł stanu sesji, czytając plik cookie sesji i znajdując dla ciebie odpowiedni zestaw zmiennych sesji.

AcquireRequestState działa przed przekazaniem kontroli do strony. Jeśli więc wywołasz na swojej stronie inne funkcje, w tym klasy statyczne, powinieneś być w porządku.

Jeśli masz jakieś zajęcia robi logiką inicjalizacji podczas uruchamiania, na przykład w przypadku Application_Start lub za pomocą statycznego konstruktora, stan Sesja może nie być dostępny. Wszystko sprowadza się do tego, czy istnieje aktualne żądanie i czy został uruchomiony AcquireRequestState.

Ponadto, należy klient Wyłączyliśmy ciasteczka, obiekt Session będą nadal dostępne - ale na następnej zamówienie, użytkownik powróci z nowym pustym Session. Dzieje się tak dlatego, że klient otrzymuje torebkę stanu sesji, jeśli jeszcze jej nie ma. Jeśli klient nie transportuje pliku cookie sesji, nie możemy zidentyfikować klienta jako takiego, więc będzie mu ponownie podawana nowa sesja.

+4

Po prostu szybka aktualizacja, którą znalazłem dzisiaj. Sesja nie jest dostępna na konstruktorze stron! Tylko w przypadku Init lub później. –

+0

Właśnie napotkałem HttpContext.Current.Session == null to kod wywoływany przez zdarzenie Page_Load strony wzorcowej. Wygląda na to, że _ może_ wystąpić w kontekście strony. Jeśli przejrzę obiekt HttpContext.Current, większość jego członków zostanie zainicjowana, ale CurrentNotification i IsPostNotification zgłoszą błąd: {System.PlatformNotSupportedException}. Niezależnie od przyczyny problem ten nie pojawił się w produkcji, która trwa od lat. Platformą jest Windows Server 2003 R2 SP2, aplikacja ma docelowy framework .Net 3.5 i działa w IIS z włączonym stanem sesji. –

+0

Odkryłem również, że gdy IIS obsługuje bezpośrednie żądanie pliku zasobu, który istnieje na dysku, takiego jak arkusz stylów, 'HttpContext.Current.Session' może mieć wartość null do kodowania w' Application_AcquireRequestState '. Żądanie samej strony powoduje jednak, że obiekt sesyjny jest dostępny do kodowania w tym miejscu. To jest pod przynajmniej MVC.NET 4. –

2

ASP.NET Technical Articles

SUMMARY: In ASP.NET, every Web page derives from the System.Web.UI.Page class. The Page class aggregates an instance of the HttpSession object for session data. The Page class exposes different events and methods for customization. In particular, the OnInit method is used to set the initialize state of the Page object. If the request does not have the Session cookie, a new Session cookie will be issued to the requester.

EDIT:

Session: A Concept for Beginners

SUMMARY: Session is created when user sends a first request to the server for any page in the web application, the application creates the Session and sends the Session ID back to the user with the response and is stored in the client machine as a small cookie. So ideally the "machine that has disabled the cookies, session information will not be stored".

15

Jeśli twoja instancja Sesji ma wartość null, a twój plik "ashx", po prostu zaimplementuj interfejs "IRequiresSessionState".

Interfejs ten nie posiada żadnych członków więc wystarczy dodać nazwę interfejsu po deklaracji klasy (C#):

public class MyAshxClass : IHttpHandler, IRequiresSessionState 
+2

Pracowałem dla mnie, korzystając ze skryptu Uploadify, dziękuję. – Renan

+0

Dziękuję bardzo, sesja była zerowa w mojej klasie logowania. Kiedy dodałem ten kod do mojego programu obsługi ashx, okazało się, że sesja w mojej klasie też była –

+0

Myślę, że to całkiem dobrze odpowiada na pytanie. Dzięki wielkie. –

38

Poniższe zestawienie nie jest całkowicie trafne:

"So if you are calling other functionality, including static classes, from your page, you should be fine"

Wywołuję metodę statyczną, która odwołuje się do sesji za pośrednictwem HttpContext.Current.Session i jest pusta. Jednak nazywam tę metodę metodą webservice poprzez ajax używając jQuery.

Jak dowiedział here można rozwiązać ten problem za pomocą prostego atrybutu o sposobie lub użyj internetową sesji usługa obiektu:

There’s a trick though, in order to access the session state within a web method, you must enable the session state management like so:

[WebMethod(EnableSession = true)]

By specifying the EnableSession value, you will now have a managed session to play with. If you don’t specify this value, you will get a null Session object, and more than likely run into null reference exceptions whilst trying to access the session object.

Dzięki Matthew Cozier do rozwiązania.

Pomyślałem, że dodam dwa centy.

Ed

+1

dzięki Ed, sesja pojawiła się jako null w webmethod - dodanie tego poprawiło to. +1 – fusi

+1

Cóż, podczas wywoływania w usłudze internetowej używasz innego żądania niż dla strony, więc instrukcja jest nadal poprawna, IMO. – driis

+0

Dokumenty MSDN [tutaj] (http://msdn.microsoft.com/en-us/library/byxd99hx%28v=vs.90%29.aspx#vbtskusingwebmethodattributeenablesession) - "domyślną wartością jest false". Działa jak marzenie. – benjineer

Powiązane problemy