ASP.NET_SessionId cookie 行为解释

ASP.NET_SessionId cookie behavior explanation

我有一个 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 并因此重定向到不需要的错误页面,因为这是用户视图中的第一次访问。

(此处“first”表示自上次运行申请以来已经有足够长的时间,比如几天)

到运行进入else块,这意味着会话是一个新会话,但也存在ASP.NET_SessionId cookie。

我的问题是:为什么会这样?这种行为是否正常且符合预期?

(我不需要解决方案,只需对行为进行一些解释就可以了...)

Asp.Net Session cookie 通常是 session cookie。也就是说,一旦所有浏览器 windows 关闭,它就会被浏览器删除。但是,如果用户让 his/her 浏览器保持打开状态并做了一段时间的其他操作,时间足以让 Asp.Net Session 在服务器上过期,然后返回您的站点,那么浏览器将发送 cookie ,服务器将无法识别它并开始新的会话。在这种情况下,您会看到您描述的问题。

一些浏览器也有某种恢复以前的会话功能,这意味着即使浏览器在这期间被关闭,原本会被删除的 cookie 将继续存在。

我还没有对此进行测试,但您可以通过将新 Asp.Net Session 的 ID 与 cookie 中的值进行比较来识别这种情况...