2010-09-22 153 views
1

鑑於這一的Global.asax.cs:會話變量正在丟失?

using System; 
using System.Web; 

namespace Foo.Web { 
    public class Global : HttpApplication { 
     private const string IntroductionPageShownSessionKey = "IntroductionPageShownSessionKey"; 

     protected void Application_AcquireRequestState(object sender, EventArgs e) { 
      ShowIntroductionIfNotYetShown(); 
     } 

     private void ShowIntroductionIfNotYetShown() { 
      if (HttpContext.Current.Session != null) { 
       var introductionPageShown = Convert.ToBoolean(Session[IntroductionPageShownSessionKey]); 
       if (!introductionPageShown) { 
        if (Request.Path.EndsWith("/Introduction.aspx")) { 
         Session[IntroductionPageShownSessionKey] = true; 
        } 
        else { 
         Response.Redirect("~/Introduction.aspx" + Request.Url.Query); 
        } 
       } 
      } 
     } 
    } 
} 
  1. 用戶點擊web應用並且被示出Introduction.aspx
  2. 用戶繼續使用web應用幾分鐘(ASP.NET_SessionId:ublbhu45ji31e055ywqu0555)
  3. 用戶幾分鐘後空閒(不執行任何回發)
  4. 用戶執行回發
  5. 用戶顯示Introduction.aspx
  6. 用戶ASP.NET_SessionId餅乾的第二次檢查仍顯示ublbhu45ji31e055ywqu0555

爲什麼用戶顯示Introduction.apsx同一ASP.NET會話內第二次?我很熟悉瓦特/ the risk in setting session variables just before a redirect in the same postback,但這不適用於此,對吧?

+0

「幾分鐘」多久?足夠長的時間讓會話超時? – 2010-09-22 15:53:07

+0

回答你的問題:不可以。我的意圖/包括會話ID是爲了證明會話永不超時。我的理解是,我們在這種情況下只處理單獨的會話。 – lance 2010-09-22 15:54:52

+0

會話ID cookie的值實際上並不直接與會話的生命週期相關聯;也就是說,即使cookie值仍然有效,發送和接受,會話仍可能超時。我要做的第一件事是檢查會話的超時值,並確保AppDomain沒有被回收。 – 2010-09-22 15:56:13

回答

0

請記住,會話本身可能具有比發送到瀏覽器的會話cookie更短的生命週期以及該cookie中設置的ID值。事實上,瀏覽器可以繼續提交一箇舊的會話ID,並且服務器將接受它並從中創建一個新的會話,如果舊的會話已過期。

的含義是兩種可能性: 1)會話超時,由於超時配置值(我不知道你的具體情況下的情況下)

2),因爲在我們已經找到了你通過對這個問題的評論:AppDomain正在關閉或被回收。