ASP.Net MVC 3:在哪里处理会话丢失?

时间:2011-03-14 18:20:00

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

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

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

我如何在MVC的某个位置执行此操作?我讨厌在我的控制器中的每个动作中检查会话状态。

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

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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");
                }

            }
        }


    }

答案 2 :(得分:0)

我同意Steve提到的内容,但我建议使用全局过滤器,而不是为所有控制器创建基类。原因是每次创建新控制器时,您应该始终记得从基本控制器派生,或者您可能会在应用程序中遇到可能需要数小时调试的随机行为。当你停止开发一段时间然后再回到它时,这一点尤为重要。

另外,另一个原因是“赞成组合而非继承”原则。