web-dev-qa-db-ja.com

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());
    }
}
37
Daniel Peñalba

Global.asaxでAcquireRequestStateを試してください。セッションは、各リクエストに対して起動するこのイベントで利用できます。

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";
    }
}
69
Pankaj

パラダイムを変更できるかもしれません...おそらく、HttpContextクラスの別のプロパティ、より具体的にはHttpContext.Current.Items以下に示すとおり:

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

セッションには保存されませんが、HttpContextクラスのItemsディクショナリに保存され、利用可能になりますその特定のリクエストの間。リクエストごとに設定するため、「セッションごと」のディクショナリに保存する方が理にかなっています。ディクショナリは、偶然にも、アイテムの内容そのものです。 :-)

質問に直接答えるのではなく要件を推測してみて申し訳ありませんが、以前にも同じ問題に直面しましたが、必要なのはセッションではなく、Itemsプロパティでした。

12
Loudenvier

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"];
        }
    }
4
David Fawzy