Как получить доступ к переменным сеанса из любого класса в ASP.NET?


Я создал файл класса в папке app_code в моем приложении. У меня есть переменная сессии

Session["loginId"]

Я хочу получить доступ к этой сессии переменные в моем классе, но когда я пишу следующую строку, то он дает ошибку

Session["loginId"]

может ли кто-нибудь сказать мне, как получить доступ к переменным сеанса в классе, который создается в папке app_code в ASP.NET 2.0 (C#)

6 147

6 ответов:

(обновление для полноты)
Вы можете получить доступ к переменным сеанса с любой страницы или элемента управления с помощью Session["loginId"] и из любого класса (например, из библиотеки классов), используя System.Web.HttpContext.Current.Session["loginId"].

но, пожалуйста, прочитайте мой оригинальный ответ...


Я всегда использую класс-оболочку вокруг ASP.NET сеанс для упрощения доступа к переменным сеанса:

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; }
}

этот класс хранит один экземпляр самого себя в ASP.NET сессия и позволяет получить доступ к вашей свойства сеанса в типобезопасном виде из любого класса, например, так:

int loginId = MySession.Current.LoginId;

string property1 = MySession.Current.Property1;
MySession.Current.Property1 = newValue;

DateTime myDate = MySession.Current.MyDate;
MySession.Current.MyDate = DateTime.Now;

этот подход имеет ряд преимуществ:

  • это избавляет вас от многих типов литья
  • вам не нужно использовать жестко закодированные сеансовые ключи во всем вашем приложении (например, Session ["loginId"]
  • вы можете документировать элементы сеанса, добавляя комментарии XML doc к свойствам MySession
  • вы можете инициализировать переменные сеанса с значения по умолчанию (например, гарантируя, что они не являются нулевыми)

доступ к сеансу через потоки HttpContext: -

HttpContext.Current.Session["loginId"]

проблема с предлагаемым решением заключается в том, что он может нарушить некоторые функции производительности, встроенные в SessionState, если вы используете внепроцессное хранилище сеансов. (либо "режим состояния сервера", либо "режим SQL Server"). В режимах ООП данные сеанса должны быть сериализованы в конце запроса страницы и десериализованы в начале запроса страницы, что может быть дорогостоящим. Для повышения производительности SessionState пытается только десериализовать то, что необходимо только десериализовать переменная, когда к ней обращаются в первый раз, и она только повторно сериализует и заменяет переменную, которая была изменена. Если у вас есть много переменных сеанса и засунуть их все в один класс, по существу, все в вашем сеансе будет десериализовано на каждом запросе страницы, который использует сеанс, и все нужно будет сериализовать снова, даже если только 1 свойство изменилось, потому что класс изменился. Просто что-то рассмотреть, если вы используете много сессии и режим ООП.

ответы, представленные перед моими, обеспечивают подходящие решения проблемы, однако я чувствую, что важно понять, почему эта ошибка приводит:

The Session свойства Page возвращает экземпляр типа HttpSessionState относительно этого конкретного запроса. Page.Session фактически эквивалентно вызову Page.Context.Session.

MSDN объясняет, как это возможно:

потому что ASP.NET страницы содержат ссылку по умолчанию на Система.Веб-пространство имен (которое содержит HttpContext класс), вы можете ссылаться на членов HttpContext на .страница aspx без полной ссылки на класс HttpContext.

однако при попытке получить доступ к этому свойству в классе в App_Code, свойство не будет доступно для вас, если ваш класс не является производным от класса страницы.

мое решение этого часто встречающегося сценария заключается в том, что я никогда не передаю объекты страницы в классы. Я бы вместо этого извлеките необходимые объекты из сеанса страницы и передайте их классу в виде коллекции / массива / списка имен-значений, в зависимости от случая.

У меня была та же ошибка, потому что я пытался манипулировать переменными сеанса внутри пользовательского класса сеанса.

Я должен был передать текущий контекст (system.сеть.свойство HttpContext.ток) в класс, а потом все получилось нормально.

Ма

Это должно быть более эффективным как для приложения, так и для разработчика.

добавьте в свой веб-проект следующий класс:

/// <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);
    }
}

}

вот реализация:

SessionCentralized.WhatEverSessionVariableYouWantToHold = id;