(Zaktualizowano dla kompletności)
Możesz uzyskać dostęp do zmiennych sesji z dowolnej strony lub sterować za pomocą Session["loginId"]
iz dowolnej klasy (np. Z wnętrza biblioteki klas), używającSystem.Web.HttpContext.Current.Session["loginId"].
Ale proszę przeczytaj moją pierwotną odpowiedź ...
Zawsze używam klasy opakowania wokół sesji ASP.NET, aby uprościć dostęp do zmiennych sesji:
public class MySession
{
// private constructor
private MySession()
{
Property1 = "default value";
}
// Gets the current session.
public static MySession Current
{
get
{
MySession session =
(MySession)HttpContext.Current.Session["__MySession__"];
if (session == null)
{
session = new MySession();
HttpContext.Current.Session["__MySession__"] = session;
}
return session;
}
}
// **** add your session properties here, e.g like this:
public string Property1 { get; set; }
public DateTime MyDate { get; set; }
public int LoginId { get; set; }
}
Ta klasa przechowuje jedno samo wystąpienie w sesji ASP.NET i umożliwia dostęp do właściwości sesji w sposób bezpieczny dla typu z dowolnej klasy, np. Tak:
int loginId = MySession.Current.LoginId;
string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;
DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;
Takie podejście ma kilka zalet:
- oszczędza ci to wielu rzutów czcionek
- nie musisz używać zakodowanych na stałe kluczy sesji w całej aplikacji (np. Session ["loginId"]
- możesz udokumentować swoje pozycje sesji, dodając komentarze do dokumentów XML we właściwościach MySession
- możesz zainicjować zmienne sesji z wartościami domyślnymi (np. zapewniając, że nie są zerowe)
Uzyskaj dostęp do sesji za pośrednictwem wątków HttpContext: -
źródło
Problem z sugerowanym rozwiązaniem polega na tym, że może ono zepsuć niektóre funkcje wydajności wbudowane w SessionState, jeśli używasz pamięci sesji poza procesem. („Tryb serwera stanu” lub „Tryb serwera SQL”). W trybach oop dane sesji muszą być serializowane na końcu żądania strony i deserializowane na początku żądania strony, co może być kosztowne. Aby poprawić wydajność, SessionState próbuje deserializować tylko to, co jest potrzebne tylko przez deserializację zmiennej, gdy jest dostępna po raz pierwszy, i tylko ponownie serializuje i zastępuje zmienną, która została zmieniona. Jeśli masz dużo zmiennych sesji i wepchniesz je wszystkie do jednej klasy, zasadniczo wszystko w sesji zostanie zdeserializowane na każdym żądaniu strony, które używa sesji, i wszystko będzie musiało zostać ponownie serializowane, nawet jeśli tylko 1 właściwość zostanie zmieniona, ponieważ klasa uległa zmianie. Po prostu coś do rozważenia, jeśli używasz dużo sesji i trybu oop.
źródło
Przedstawione wcześniej odpowiedzi dostarczają trafnych rozwiązań problemu, jednak uważam, że ważne jest, aby zrozumieć, dlaczego ten błąd występuje:
Session
Nieruchomość zPage
zwraca instancję typuHttpSessionState
w stosunku do danego wniosku.Page.Session
jest właściwie równoznaczne z dzwonieniemPage.Context.Session
.MSDN wyjaśnia, jak to jest możliwe:
Jednak podczas próby uzyskania dostępu do tej właściwości w klasie w App_Code właściwość nie będzie dostępna, chyba że Twoja klasa pochodzi z klasy strony.
Moim rozwiązaniem tego często spotykanego scenariusza jest to, że nigdy nie przekazuję obiektów strony do klas . Wolałbym raczej wyodrębnić wymagane obiekty ze strony Session i przekazać je do Class w postaci kolekcji nazwa-wartość / Array / List, w zależności od przypadku.
źródło
Miałem ten sam błąd, ponieważ próbowałem manipulować zmiennymi sesji wewnątrz niestandardowej klasy sesji.
Musiałem przekazać aktualny kontekst (system.web.httpcontext.current) do klasy, a potem wszystko poszło dobrze.
MAMA
źródło
W asp.net core działa to inaczej:
Źródło: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
źródło
Powinno to być bardziej wydajne zarówno dla aplikacji, jak i dla programisty.
Dodaj następującą klasę do swojego projektu internetowego:
Oto realizacja:
źródło