Как получить доступ к переменным сеанса из любого класса в ASP.NET?
Я создал файл класса в папке app_code в моем приложении. У меня есть переменная сессии
Session["loginId"]
Я хочу получить доступ к этой сессии переменные в моем классе, но когда я пишу следующую строку, то он дает ошибку
Session["loginId"]
может ли кто-нибудь сказать мне, как получить доступ к переменным сеанса в классе, который создается в папке app_code в ASP.NET 2.0 (C#)
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
- вы можете инициализировать переменные сеанса с значения по умолчанию (например, гарантируя, что они не являются нулевыми)
проблема с предлагаемым решением заключается в том, что он может нарушить некоторые функции производительности, встроенные в 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;