2012-04-13 106 views
0

我在我的Asp.net應用程序中,我設置會話超時,並經過一段時間後,該會議仍未過期的問題。這個應用程序有一個SQL Server 2008後端數據庫,並且在那裏存儲此應用程序的會話超時值。我目前將其設置爲3分鐘用於測試目的。在Global.asax中,在在session_start我有以下幾點:ASP.Net會話超時不工作

 // Set the timeout 
     int timeout = GetSessionLength(); 
     this.Session.Timeout = timeout; 

而且GetSessionLength()是查詢數據庫的會話超時後返回一個整數值的函數。

然後,在該網站的主頁,在Page_Load中,我有以下幾點:

 System.Web.UI.HtmlControls.HtmlMeta hmRefresh = new System.Web.UI.HtmlControls.HtmlMeta(); 
     hmRefresh.HttpEquiv = "Refresh"; 
     hmRefresh.Content = (this.Session.Timeout * 60).ToString(); 
     Page.Header.Controls.Add(hmRefresh); 

這將導致頁面刷新自身一旦超時被擊中。我的頁面使用它成功刷新自己。但是,當會話過期時,我還有其他一些代碼會被擊中,但是它永遠不會被擊中,因爲它顯示會話永不過期。

此外,我一直在開發一個不同的應用程序在我的電腦上,我使用相同的代碼在該應用程序來檢測會話超時,它正在完美的應用程序。所以我不確定爲什麼它不是這個。

+1

根據服務器的情況,如果您等待了幾秒鐘,爲了確保時間已過,該怎麼辦?遠射... – 2012-04-13 16:28:47

+1

出於好奇,你知道ASP.NET可以通過使用web.config文件爲你管理所有這些,對吧? – 2012-04-13 16:30:18

+0

@ ajax81,是的,我非常清楚這一點。爲了安全起見,我想遠程地從SQL Server中進行更改。如果我們選擇的會話長度太短,我可以輕鬆地更改它。 – 2012-04-13 16:35:10

回答

1

我猜你在元刷新之間的同一會話中還有其他一些請求。同一會話中的任何請求都會過期。此外,您還會嘗試在會話過期時進行刷新,因此很有可能會在元刷新時隨機過期/不過期。

調試使用http調試器(如Fiddler)並驗證發送了什麼請求。

注:與SQL會話狀態沒有關於到期通知(不像在內存中的一個),所以要知道,如果會話狀態在SQL /國家服務的情況下到期,唯一的辦法就是看是否Session對象爲空。如果您使用Session_End,請檢查Session-State Events

僅當會話狀態Mode屬性設置爲InProc(缺省值)時才支持Session_OnEnd事件。

+0

這個答案與@AndrewBarber評論一起組合。會話超時時發生了一些奇怪的行爲。我將刷新時間增加了10秒,但仍然沒有過期,所以我嘗試了30秒,到那個時候它已經過期。中間沒有任何請求會導致它過期。無論如何,增加更新時間解決了這個問題。 – 2012-04-15 22:51:25