Установить переменную сеанса в Application_BeginRequest - PullRequest
37 голосов
/ 12 мая 2011

Я использую 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());
    }
}

Ответы [ 3 ]

68 голосов
/ 12 мая 2011

Попробуйте AcquireRequestState в Global.asax. В этом событии доступна сессия, которая запускается для каждого запроса:

void Application_AcquireRequestState(object sender, EventArgs e)
{
    // Session is Available here
    HttpContext context = HttpContext.Current;
    context.Session["foo"] = "foo";
}

Valamas - Предлагаемые изменения:

Используется с MVC 3 успешно и позволяет избежать ошибки сеанса.

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
    HttpContext context = HttpContext.Current;
    if (context != null && context.Session != null)
    {
        context.Session["foo"] = "foo";
    }
}
12 голосов
/ 11 июля 2012

Может быть, вы могли бы изменить парадигму ... Возможно, вы можете использовать другое свойство класса HttpContext, более конкретно HttpContext.Current.Items, как показано ниже:

protected void Application_BeginRequest(Object sender, EventArgs e)
{
    HttpContext.Current.Items["__MySessionVariable"] = new object();
}

Оно не будет сохранено всеанс, но он будет храниться в словаре Items класса HttpContext и будет доступен на время этого конкретного запроса .Так как вы устанавливаете его при каждом запросе, было бы более разумно сохранить его в словаре «за сессию», который, кстати, и является тем, что представляет собой «Предметы».: -)

Извините, что пытаюсь вывести ваши требования вместо того, чтобы прямо отвечать на ваш вопрос, но я сталкивался с этой же проблемой раньше и заметил, что мне нужна была не сессия, а свойство Items вместо.

4 голосов
/ 02 апреля 2014

Вы можете использовать элементы сеанса в 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"];
        }
    }
...