当我的会话丢失或重建项目时,我已经开始遇到错误,因为我的表单身份验证cookie仍然存在。
在WebForms中,我使用与需要登录的页面关联的母版页来检查会话。
我如何在MVC的某个位置执行此操作?我讨厌在我的控制器中的每个动作中检查会话状态。
另一方面,我不能只应用全局过滤器,因为并非所有控制器都需要会话状态。
在我的布局视图中是否可能?这是需要会话的页面唯一的共同点。
答案 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提到的内容,但我建议使用全局过滤器,而不是为所有控制器创建基类。原因是每次创建新控制器时,您应该始终记得从基本控制器派生,或者您可能会在应用程序中遇到可能需要数小时调试的随机行为。当你停止开发一段时间然后再回到它时,这一点尤为重要。
另外,另一个原因是“赞成组合而非继承”原则。