Подтвердить что ты не робот

Установить переменную сеанса в 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());
    }
}
4b9b3361

Ответ 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"];
        }
    }