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

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

Session["loginId"]

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

Session["loginId"]

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

Ответ 1

(Обновлено для полноты)
Вы можете получить доступ к переменным сеанса с любой страницы или элемента управления с помощью 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-документа к свойствам MySession.
  • вы можете инициализировать переменные сеанса со значениями по умолчанию (например, убедитесь, что они не являются нулевыми)

Ответ 2

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

HttpContext.Current.Session["loginId"]

Ответ 3

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

Ответ 4

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

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

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

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

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

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

Ответ 5

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

Мне пришлось передать текущий контекст (system.web.httpcontext.current) в класс, а затем все получилось отлично.

МА

Ответ 6

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

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

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

Ответ 7

В ядре asp.net это работает по-разному:

public class SomeOtherClass
{
    private readonly IHttpContextAccessor _httpContextAccessor;
    private ISession _session => _httpContextAccessor.HttpContext.Session;

    public SomeOtherClass(IHttpContextAccessor httpContextAccessor)
    {
        _httpContextAccessor = httpContextAccessor;
    }

    public void TestSet()
    {
        _session.SetString("Test", "Ben Rules!");
    }

    public void TestGet()
    {
        var message = _session.GetString("Test");
    }
}

Источник: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/