我有一个MVC ASP.NET
项目并具有以下操作过滤器属性
public override void OnActionExecuting(System.Web.Mvc.ActionExecutingContext filterContext)
{
HttpContext ctx = HttpContext.Current;
if (ctx.Session != null)
{
if (ctx.Session.IsNewSession)
{
string sessionCookie = ctx.Request.Headers["Cookie"];
if ((null != sessionCookie) && (sessionCookie.IndexOf("ASP.NET_SessionId") >= 0))
{
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = new JsonResult { Data = "Session Timeout. Redirecting...", ContentType = "application/json" };
filterContext.HttpContext.Response.StatusCode = 440;
}
else
{
filterContext.Result = new RedirectToRouteResult(
new RouteValueDictionary
{
{ "Controller", "Error" },
{ "Action", "SessionTimeout" }
});
}
}
}
}
}
我要做的是重定向到SessionTimeout
操作,只要IIS会话超时,就会显示错误页面。
大部分时间它工作正常但我发现有时候,特别是第一次启动应用程序时,此代码将运行到else
块,从而重定向到错误页面是不需要的,因为这是用户的第一次访问'图。
(此处" 首先"表示自上次运行应用程序以来的足够长的时间,比如几天)
要进入else
块,这意味着会话是一个新会话,但也存在ASP.NET_SessionId
个cookie。
我的问题是:为什么会这样?这种行为是正常的吗?预期?
(我不需要解决方案,只是对行为的一些解释很好......)
答案 0 :(得分:1)
Asp.Net Session
Cookie通常是会话 Cookie。也就是说,一旦关闭所有浏览器窗口,它就会被浏览器删除。但是,如果用户离开他/她的浏览器并暂时执行其他操作,足以使Asp.Net Session
在服务器上过期,然后返回到您的站点,则浏览器将发送cookie,服务器无法识别它并开始新的会话。在这种情况下,您将看到您描述的问题。
某些浏览器还具有某种还原以前的会话功能,这意味着即使浏览器在两者之间关闭,否则将被删除的Cookie将继续存在。
我还没有对此进行过测试,但您可以通过将新Asp.Net Session
的ID与Cookie中的值进行比较来识别这种情况......