2017-02-10 37 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