2011-12-06 62 views
1

我不確定爲什麼,但只有經過一定的時間後,我的Web應用程序全局變量纔會丟失值以及會話變量。我在web配置文件<sessionState timeout="60" />中設置。這是在我的本地主機上,我還沒有把它放在網絡服務器上,這可能是原因嗎?asp.net全局變量和會話變量在5-15分鐘後丟失值

+0

什麼是將sessionState在你的網絡超時配置?在那段閒置時間過去之後,它會失去語境。 – Matt

+1

請勿使用全局變量。多個請求可以同時觸及它們,這意味着多個不同的用戶可以同時觸摸它們。 –

回答

2

具有inproc會話狀態,如果應用程序池回收或關閉,您的會話信息消失。檢查應用程序池回收時發生的iis設置。我相信在20分鐘不活動之後會有一個默認關閉應用程序池。這可能會發生許多其他原因。如果您需要會話超越應用程序池的壽命,那麼您應該將其從proc中移出並運行在狀態服務器或數據庫或其他定製的服務器上。

+0

我有一個Windows 7電腦,我該去哪裏檢查IIS? – user516883

+0

打開iis管理器(最簡單的方法是打開windows鍵,然後開始輸入iis - 它會出現在列表中)。在機器名稱左側的樹視圖中,您將看到應用程序池的節點。點擊它會在右側的列表視圖中顯示應用程序池。點擊您的應用程序池,然後點擊右側的高級設置...鏈接。您將看到像Private Memory Lmiit(KB),Idle Time-out(分鐘),請求限制,常規時間間隔(分鐘)之類的事情。這些東西控制應用程序池的回收。 –

+0

我想這不適用,如果你使用本地主機,我沒有看到我的管理工具中的任何地方iis。 – user516883

1

如果它在IIS中運行,你有Regular Time Interval (minutes)Idle Time-out (minutes)到一個較低的值?這些設置可以在應用程序池的Advanced Settings...下找到。

0

這也許不能解決你的問題,但你可以添加以下內容到頁面的OnInit的判斷會話是否已經實際超時或不:

override protected void OnInit(EventArgs e) 
{ 
    // Initialize the base Page class. 
    base.OnInit(e); 
    //If the session exists 
    if (Context.Session != null) 
    { 
     // IsNewSession indicates the session has been reset or the user's session has timed out. 
     if (Session.IsNewSession) 
     { 
      // new session, check for a cookie. 
      string cookie = Request.Headers["Cookie"]; 
      // If there is a cookie does it contain ASP.NET Session ID? 
      if ((null != cookie) && 
       (cookie.IndexOf("ASP.NET_SessionId") >= 0)) 
      { 
       // Since it's a new session but an ASP.NET cookie exists, the session has expired. Notify the user. 
       throw new Exception("Your session has timed out. "); 
      } 
     } 
    } 
}