(Обновлено для полноты)
Вы можете получить доступ к переменным сеанса с любой страницы или элемента управления, используя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
- вы можете инициализировать переменные сеанса значениями по умолчанию (например, убедившись, что они не равны NULL)
Доступ к сессии через потоки HttpContext: -
источник
Проблема с предлагаемым решением заключается в том, что оно может нарушить некоторые функции производительности, встроенные в SessionState, если вы используете хранилище сеансов вне процесса. (либо «Режим сервера состояний», либо «Режим сервера SQL»). В режиме oop данные сеанса должны быть сериализованы в конце запроса страницы и десериализованы в начале запроса страницы, что может быть дорогостоящим. Для повышения производительности SessionState пытается десериализовать только то, что необходимо, только десериализовать переменную при первом обращении к нему, и он только повторно сериализует и заменяет переменную, которая была изменена. Если у вас есть много переменных сеанса и они объединены в один класс, то, по сути, все в вашем сеансе будет десериализовано при каждом запросе страницы, который использует сеанс, и все будет необходимо снова сериализовать, даже если изменилось только 1 свойство, так как класс изменился. Просто что-то, чтобы рассмотреть, если вы используете много сеанса и режим oop.
источник
Ответы, представленные ранее, дают правильное решение проблемы, однако я чувствую, что важно понять, почему возникает эта ошибка:
Session
СобственностьPage
возвращает экземпляр типа поHttpSessionState
отношению к этому конкретному запросу.Page.Session
на самом деле эквивалентно вызовуPage.Context.Session
.MSDN объясняет, как это возможно:
Однако, когда вы пытаетесь получить доступ к этому свойству внутри класса в App_Code, это свойство не будет вам доступно, если ваш класс не является производным от класса страницы.
Мое решение этого часто встречающегося сценария состоит в том, что я никогда не передаю объекты страниц классам . Я бы предпочел извлечь необходимые объекты со страницы Session и передать их классу в виде коллекции значений / массивов / списков, в зависимости от случая.
источник
У меня была та же ошибка, потому что я пытался манипулировать переменными сеанса внутри пользовательского класса Session.
Я должен был передать текущий контекст (system.web.httpcontext.current) в класс, а затем все работало нормально.
Массачусетс
источник
В ядре asp.net это работает по-разному:
Источник: https://benjii.me/2016/07/using-sessions-and-httpcontext-in-aspnetcore-and-mvc-core/
источник
Это должно быть более эффективным как для приложения, так и для разработчика.
Добавьте следующий класс в ваш веб-проект:
Вот реализация:
источник