ASP.NET_SessionId cookie行为说明

时间:2017-02-10 03:21:12

标签: c# asp.net asp.net-mvc cookies iis-7

我有一个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。

我的问题是:为什么会这样?这种行为是正常的吗?预期?

(我不需要解决方案,只是对行为的一些解释很好......)

1 个答案:

答案 0 :(得分:1)

Asp.Net Session Cookie通常是会话 Cookie。也就是说,一旦关闭所有浏览器窗口,它就会被浏览器删除。但是,如果用户离开他/她的浏览器并暂时执行其他操作,足以使Asp.Net Session在服务器上过期,然后返回到您的站点,则浏览器将发送cookie,服务器无法识别它并开始新的会话。在这种情况下,您将看到您描述的问题。

某些浏览器还具有某种还原以前的会话功能,这意味着即使浏览器在两者之​​间关闭,否则将被删除的Cookie将继续存在。

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