Установить переменную сеанса в Application_BeginRequest
Я использую ASP.NET MVC, и мне нужно установить переменную сеанса в Application_BeginRequest
. Проблема в том, что в этот момент объект HttpContext.Current.Session
всегда null
.
protected void Application_BeginRequest(Object sender, EventArgs e)
{
if (HttpContext.Current.Session != null)
{
//this code is never executed, current session is always null
HttpContext.Current.Session.Add("__MySessionVariable", new object());
}
}
Ответы
Ответ 1
Попробуйте AcquireRequestState в Global.asax. Сессия доступна в этом событии, которое срабатывает для каждого запроса:
void Application_AcquireRequestState(object sender, EventArgs e)
{
// Session is Available here
HttpContext context = HttpContext.Current;
context.Session["foo"] = "foo";
}
Валамас - Предлагаемое редактирование:
Используется с MVC 3 успешно и позволяет избежать ошибки сеанса.
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
if (context != null && context.Session != null)
{
context.Session["foo"] = "foo";
}
}
Ответ 2
Может быть, вы можете изменить парадигму... Возможно, вы можете использовать другое свойство класса HttpContext, а точнее HttpContext.Current.Items, как показано ниже:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
HttpContext.Current.Items["__MySessionVariable"] = new object();
}
Он не будет хранить его в сеансе, но он будет сохранен в словаре Items класса HttpContext и будет доступен на протяжении всего указанного запроса. Поскольку вы настраиваете его при каждом запросе, было бы разумнее хранить его в словаре "за сеанс", который, между прочим, является именно тем, что все элементы.: -)
Извините, что попытался вывести свои требования вместо ответа на свой вопрос напрямую, но перед этим я столкнулся с такой же проблемой и заметил, что мне нужно было не сеанс вообще, а свойство Items.
Ответ 3
Вы можете использовать элементы сеанса в Application_BeginRequest следующим образом:
protected void Application_BeginRequest(object sender, EventArgs e)
{
//Note everything hardcoded, for simplicity!
HttpCookie cookie = HttpContext.Current.Request.Cookies.Get("LanguagePref");
if (cookie == null)
return;
string language = cookie["LanguagePref"];
if (language.Length<2)
return;
language = language.Substring(0, 2).ToLower();
HttpContext.Current.Items["__SessionLang"] = language;
Thread.CurrentThread.CurrentUICulture = CultureInfo.CreateSpecificCulture(language);
}
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
if (context != null && context.Session != null)
{
context.Session["Lang"] = HttpContext.Current.Items["__SessionLang"];
}
}