【问题标题】:ASP.Net MVC 3: Where to handle session loss?ASP.Net MVC 3:在哪里处理会话丢失?
【发布时间】:2011-03-14 18:19:59
【问题描述】:

当我的会话丢失或重建我的项目时,我开始遇到错误,因为我的表单身份验证 cookie 仍然存在。

在 WebForms 中,我会使用与需要登录的页面关联的母版页来简单地检查会话。

如何在 MVC 中的一个位置执行此操作?我不想在我的控制器的每个操作中检查会话状态。

另一方面,我也不能只应用全局过滤器,因为并非所有控制器都需要会话状态。

在我的布局视图中可能吗?这是需要会话的页面的唯一共同点。

【问题讨论】:

    标签: asp.net-mvc-3 session-timeout


    【解决方案1】:

    您可以做的一件事是对需要会话状态的控制器进行子类化。这样你就可以在这个基本控制器上创建一个过滤器。这将允许您在一个地方完成所有操作。另外,正如您所指出的,全局过滤器在这里对您没有帮助,因为逻辑并不适用于每个控制器。

    【讨论】:

    • +1 这似乎是个好主意,但是控制器是否有一个我可以签入的中心入口点? (对于我的基本控制器)
    • @Steffen - 你的目标是让它保持干燥并且只在你的代码中包含一次逻辑。因此,您为需要此功能的控制器创建了一个从 only 继承的基本控制器。然后将过滤器应用于此控制器的类声明,以便为控制器(或其任何子类)执行的所有操作方法运行它。
    【解决方案2】:

    将其添加到会话开始。如果发生会话丢失,它也需要触发会话开始。您可以按如下方式处理它:

    protected void Session_Start(object src, EventArgs e)
        {
            if (Context.Session != null)
            {
                if (Context.Session.IsNewSession)
                {
                    string sCookieHeader = Request.Headers["Cookie"];
                    if ((null != sCookieHeader) && (sCookieHeader.IndexOf("ASP.NET_SessionId") >= 0))
                    {
                        // how to simulate it ???   
                        // RedirectToAction(“ActionName”, “ControllerName”,  route values);  
                        Response.Redirect("/Home/TestAction");
                    }
    
                }
            }
    
    
        }
    

    【讨论】:

      【解决方案3】:

      我同意史蒂夫所说的,但我建议使用全局过滤器而不是为所有控制器创建基类。这样做的原因是每次您创建一个新控制器时,您应该始终记住从基本控制器派生,否则您可能会在应用程序中遇到随机行为,这可能会花费您数小时的调试时间。当您停止开发一段时间然后重新开始开发时,这一点尤其重要。

      另外,另一个原因是“优先组合优于继承”原则。

      【讨论】:

        猜你喜欢
        • 2021-03-03
        • 1970-01-01
        • 1970-01-01
        • 2017-09-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-18
        相关资源
        最近更新 更多