2011-11-13 39 views
0

我希望我的網頁在SessionState超時發生時關閉。這是我的代碼在我的網頁配置:ASP.NET SessionState TimeOut不工作

<system.web> 
<sessionState timeout="1" mode="InProc"/> 
</system.web> 

我設置爲1分鐘用於測試目的。以下是我的Global.asax代碼:

protected void Session_End(object sender, EventArgs e) 
{ 
    Response.Redirect("~/LogOut.aspx"); 
} 

我把在標籤上,以檢查會話超時的一個頁面,這是在Page_Load事件中的代碼:

lblSession.Text = "SESSION TIME: " + Session.Timeout.ToString(); 

當我進入該網站並進入該頁面,標籤顯示SESSION TIME:1,但1分鐘後,我沒有被重定向到LogOut頁面,並且本頁面仍然完全活動並且工作,顯然意味着會話尚未終止。 我在Visual Studio 2008中通過開發服務器工作,所以我看到的有關IIS設置的建議在這個階段似乎沒有相關性。 請幫忙!

回答

2

HTTP是一個請求/響應協議。在瀏覽器和服務器之間沒有沒有持久連接。因此Session_End中的代碼實際上什麼都不做 - 它不能告訴瀏覽器做任何事情。

您需要製作一個(客戶端)JavaScript定時器,actively會在會話超時過去之前加載註銷頁面。

+1

該代碼甚至可能會崩潰,因爲響應在此時爲空。 –

+0

可以給我一些幫助,使一個javaScript計時器?謝謝。 –

+1

我使用了一個AJAX計時器。在page_Load中,我將會話超時值放入一個int變量乘以60000,以便以毫秒爲單位計算超時值,然後將該計時器的interval屬性設置爲超時減去2000毫秒,以便計時器在會話超時過去之前觸發一點。這引發了我重定向到LogOut頁面的Timer_Tick事件。它很好地工作。謝謝! –

0

這似乎不是測試會話超時的正確方法。嘗試在會話變量中添加一些內容。請勿再觸摸該頁面幾分鐘,然後嘗試從Session中讀取它。如果你的會話還活着,你應該能夠看到變量,否則......你不會。

瞭解更多關於會議和故障維修... http://aspalliance.com/1182_Troubleshooting_Session_Related_Issues_in_ASPNET

+0

謝謝你,我看到你的鏈接處理會話丟失,但我的問題似乎是相反的,會話不會結束,當它應該,頁面繼續作出反應,按鈕作出反應,並導致回發爲平常等。 –

+0

@DovMiller,Ondrej已經說得恰如其分了。爲了簡單地解釋它,Session_End根本不會在「瀏覽器」中觸發。這是會話結束時服務器發生的事件。由於客戶在此期間可能會或可能不會連接,因此您無法做到AFAIK您可以做出迴應。在這個事件中重定向。因此,你不會看到瀏覽器自動作出反應。你有沒有機會嘗試我之前提出的會話變量方法? –

1

Session_End在我的經驗得到(可通過客戶端的定時器來實現)呼籲第一回發發生超時後 - 只要這可能是。 ..如果用戶只關閉瀏覽器,這個事件可能永遠不會被調用(除非你在這種情況下做了特定的JS處理程序unload)。

對於一些信息,請參閱:

+0

謝謝你的一些鏈接對我有幫助。 –

+0

@DovMiller歡迎您:-)請不要忘記將upvote/mark標記爲已接受的答案,以幫助您(請參閱http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer -工作)。 – Yahia