ASP.NET MVC3 と Razor 構文を使用して簡単なテスト Web サイトを開発しています。各ページのサイトの上部にユーザーIDを印刷するため_LayoutPage.cshtml
に使用するマスターテンプレートとして持っています。@HTML.Action
ユーザーIDを読み取って出力する、この部分ビューのchildAction
名前付きを実装しました。子アクションは、派生元と呼ばれるコントローラーで実装されます。ユーザーIDに加えて、セッションからさらに2つの変数を読み取り、それを出力します。userInfo
HTTPContext.Session
CommonActionController
Controller
public class CommonActionController: Controller
{
[ChildActionOnly]
public ActionResult userInfo()
{
if(HTTPContext.Session["x-user-id"] != null)
{
ViewBag.UserId = (string)(HTTPContext.Session["x-user-id"]);
ViewBag.UserFirstName = (string)(HTTPContext.Session["x-user-first-name"]);
ViewBag.UserLastName = (string)(HTTPContext.Session["x-user-last-name"]);
ViewBag.UserLoggedinSince = (DateTime)(HTTPContext.Session["x-user-logon-timestamp"]).ToString("f");
}
return PartialView();
}
}
呼び出されたメイン ページ コントローラHomeController
には、ダッシュボード機能が実際に実装されていDashboard
ます (現在、「Dashboard」という単語が出力されるだけです)。このコントローラーではController.OnActionExecuting()
、ユーザー ID がセッションに存在することを検証するメソッドをオーバーライドしました。前述の childAction と同様に、セッションから合計 3 つの変数を読み取ります。
public class HomeController: Controller
{
public HomeController()
{
}
protected override void OnActionExecuting(ActionExecutingContext ctx)
{
base.OnActionExecuting(ctx);
if(HTTPContext.Session["x-user-id"] == null)
ctx.Result = new RedirectResult("logon/userlogon");
if(HTTPContext.Session["x-user-logon-timestamp"] == null)
ctx.Result = new RedirectResult("logon/userlogon");
if(HTTPContext.Session["x-user-internal-flag"] == null)
ctx.Result = new RedirectResult("logon/userlogon");
}
public ActionResult Dashboard()
{
// nothing to see here
return View();
}
}
コードを少しクリーンアップして、debug.print ステートメントを削除しました。
ログによると、OnActionExecuting()
メソッドとuserInfo
子アクションが同時に呼び出されていることがわかります。ある時点OnActionExecuting()
で、セッション変数の null を取得します。ログを見ると、ポイントChildAction
が呼び出されるまで、セッション変数の値が 内に保持されていることがわかりますOnActionExecuting()
。がchildaction
アクセスすると、null になります。
子アクションからセッションにアクセスするコードにコメントすると、すべて正常に動作します。私は何を間違っていますか?セッション変数にアクセスする際に注意すべきことはありますか? これは、Session に非同期的にアクセスする方法についての私の無知によるものですか?
私も私の中に以下を持っていますweb.config
:
<modules runAllManagedModulesForAllRequests="true"/>