1

ASP.NET MVC3 と Razor 構文を使用して簡単なテスト Web サイトを開発しています。各ページのサイトの上部にユーザーIDを印刷するため_LayoutPage.cshtmlに使用するマスターテンプレートとして持っています。@HTML.Action

ユーザーIDを読み取って出力する、この部分ビューのchildAction名前付きを実装しました。子アクションは、派生元と呼ばれるコントローラーで実装されます。ユーザーIDに加えて、セッションからさらに2つの変数を読み取り、それを出力します。userInfoHTTPContext.SessionCommonActionControllerController

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"/>
4

1 に答える 1