Jak uzyskać dostęp do zmiennych sesji z dowolnej klasy w ASP.NET?
Utworzyłem plik klasy w folderze App_Code w mojej aplikacji. Mam zmienną sesji
Session["loginId"]
Chcę uzyskać dostęp do zmiennych sesji w mojej klasie, ale kiedy piszę następującą linię, to daje błąd
Session["loginId"]
Czy ktoś może mi powiedzieć jak uzyskać dostęp do zmiennych sesji w klasie, która jest utworzona w folderze app_code w ASP.NET 2.0 (C#)
6 answers
(Aktualizacja dla kompletności)
Możesz uzyskać dostęp do zmiennych sesji z dowolnej strony lub kontrolki za pomocą Session["loginId"]
i z dowolnej klasy( np. z biblioteki klas), używając System.Web.HttpContext.Current.Session["loginId"].
Ale proszę przeczytać moją oryginalną odpowiedź...
Zawsze używam klasy owijarki wokół ASP.NET session to simplify access to session variables:
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; }
}
Klasa ta przechowuje jedną instancję w ASP.NET sesji 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;
To podejście ma kilka zalet:
- To oszczędza od wielu Typ-odlewania
- nie musisz używać twardych kluczy sesji w całej aplikacji (np. Session["loginId"]
- możesz dokumentować elementy sesji, dodając komentarze XML doc dotyczące właściwości MySession
- możesz zainicjować zmienne sesji wartościami domyślnymi (np. upewniając się, że nie są null)
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
2012-07-23 09:24:07
Dostęp do sesji poprzez wątki HttpContext: -
HttpContext.Current.Session["loginId"]
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
2009-03-07 08:50:37
Problem z sugerowanym rozwiązaniem polega na tym, że może on złamać niektóre funkcje wydajności wbudowane w SessionState, jeśli używasz out-of-process session storage. ("tryb serwera stanowego" 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 deserializując zmienna, gdy jest dostępna po raz pierwszy, i tylko Re-serializuje i zastępuje zmienną, która została zmieniona. Jeśli masz dużo zmiennych sesji i wsadzić je wszystkie do jednej klasy zasadniczo wszystko w sesji będzie deserializowane na każdym żądaniu strony, która używa sesji i wszystko będzie musiało być serializowane ponownie, nawet jeśli tylko 1 właściwość zmieniła się z powodu zmiany klasy. Po prostu coś do rozważenia, jeśli używasz dużo sesji i trybu oop.
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-06-10 17:42:14
Odpowiedzi przedstawione przed moim dostarczają trafnych rozwiązań problemu, jednak uważam, że ważne jest, aby zrozumieć, dlaczego ten błąd powoduje:
Właściwość Session
Page
zwraca instancję typu HttpSessionState
względem danego żądania. {[3] } jest równoznaczne z wywołaniem Page.Context.Session
.
MSDN wyjaśnia, jak to jest możliwe:
Ponieważ ASP.NET strony zawierają domyślne odniesienie do systemu.Web namespace (która zawiera
HttpContext
klasy), można odwoływać się do członkówHttpContext
nastrona aspx bez w pełni kwalifikowanego odniesienia do klasyHttpContext
.
Jednakże, gdy spróbujesz uzyskać dostęp do tej właściwości w ramach klasy w App_Code, właściwość ta nie będzie dostępna dla Ciebie, chyba że twoja klasa wywodzi się z klasy Page.
Moim rozwiązaniem tego często spotykanego scenariusza jest to, że nigdy nie przekazuję obiektów strony do klas . Wolałbym wyodrębnić wymagane obiekty z sesji strony i przekazać je do klasa w postaci kolekcji nazw-wartości / tablicy / listy, w zależności od przypadku.
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
2009-03-07 11:28:53
Miałem ten sam błąd, ponieważ próbowałem manipulować zmiennymi sesji wewnątrz niestandardowej klasy sesji.
Musiałem przekazać aktualny kontekst (system.www.httpcontext.prąd) do klasy, a potem wszystko wyszło dobrze.
MA
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
2012-02-12 22:47:56
Powinno to być bardziej efektywne zarówno dla aplikacji, jak i dla programisty.
Dodaj następującą klasę do swojego projektu www:
/// <summary>
/// This holds all of the session variables for the site.
/// </summary>
public class SessionCentralized
{
protected internal static void Save<T>(string sessionName, T value)
{
HttpContext.Current.Session[sessionName] = value;
}
protected internal static T Get<T>(string sessionName)
{
return (T)HttpContext.Current.Session[sessionName];
}
public static int? WhatEverSessionVariableYouWantToHold
{
get
{
return Get<int?>(nameof(WhatEverSessionVariableYouWantToHold));
}
set
{
Save(nameof(WhatEverSessionVariableYouWantToHold), value);
}
}
}
Oto implementacja:
SessionCentralized.WhatEverSessionVariableYouWantToHold = id;
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
2018-04-19 22:46:20