2017-02-10 35 views
0

我有一个MVC ASP.NET项目,并有操作筛选属性以下ASP.NET_SessionId的cookie行为的解释

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

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

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

我没有测试过这一点,但你可能能够通过新Asp.Net Session的ID比较cookie中的价值认识到这种情况... ...

+0

谢谢......这是多一点清楚我现在。关闭浏览器(为了删除这个会话cookie),是否意味着关闭浏览器的所有选项卡? (我正在使用Chrome) – shole

+0

是的,不同的浏览器标签通常共享相同的客户端会话。即使不同的浏览器窗口通常共享相同的客户端会话 – user1429080