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());
}
}
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";
}
}
パラダイムを変更できるかもしれません...おそらく、HttpContext
クラスの別のプロパティ、より具体的にはHttpContext.Current.Items
以下に示すとおり:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
HttpContext.Current.Items["__MySessionVariable"] = new object();
}
セッションには保存されませんが、HttpContextクラスのItemsディクショナリに保存され、利用可能になりますその特定のリクエストの間。リクエストごとに設定するため、「セッションごと」のディクショナリに保存する方が理にかなっています。ディクショナリは、偶然にも、アイテムの内容そのものです。 :-)
質問に直接答えるのではなく要件を推測してみて申し訳ありませんが、以前にも同じ問題に直面しましたが、必要なのはセッションではなく、Itemsプロパティでした。
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"];
}
}