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#)

Author: M4N, 2009-03-07

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)
 341
Author: M4N,
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"]
 99
Author: AnthonyWJones,
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.

 22
Author: Ernie,
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ów HttpContext nastrona aspx bez w pełni kwalifikowanego odniesienia do klasy HttpContext.

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.

 12
Author: Cerebrus,
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

 1
Author: Munawar Ali,
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;
 0
Author: Captain America,
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