2013-02-07 30 views
1

在Global.asax文件中的事件是這樣寫的:爲什麼「Session_end」無法使用?

protected void Session_End(Object sender, EventArgs e) 
{ 
    var x = 5; 
} 

代碼不會到達那裏時,客戶端關閉窗口,爲什麼呢?

+0

因爲該功能在會話結束時觸發。關閉瀏覽器窗口不會結束會話。在IIS中檢查您的會話超時值。我希望它在瀏覽器關閉後的那段時間內觸發。 – asawyer

回答

3

當客戶端關閉窗口時,代碼沒有到達那裏,爲什麼?

因爲這個事件不應該在客戶端關閉瀏覽器時調用。這個事件(顧名思義)是在會話過期時被調用的。默認會話到期超時時間爲20分鐘,因此在客戶端關閉瀏覽器20分鐘後將調用此事件。

哦,還有,你應該知道的一個很重要的疑難雜症:如果您使用的進程外,在會話狀態模式(如的StateServer或SqlServer的)這一事件將永遠被調用。

+3

+1以及與會話模式相關的Session_End方法。 –

+0

那我該怎麼辦呢? – Refael

+1

@Refael,做什麼?檢測到客戶已關閉瀏覽器?這不可能。你不應該試圖檢測。您可以使用javascript並訂閱['onbeforeunload'](https://developer.mozilla.org/en-US/docs/DOM/window.onbeforeunload)事件,當客戶端離開頁面時將調用該事件。 –

1

P.S:該Session_End事件僅由InProc會話管理器

當你的會話中獲取過期它被調用支載。

0

我認爲你的需要是在頁面關閉或文檔解開時使用javascript函數,即onbeforeunload。並且在該函數中向服務器發出ajax請求,指示客戶端正在關閉窗口。但是您應該注意安全性,因爲這種JavaScript方法在客戶端註冊,惡意用戶可以更改ajax請求(甚至阻止它)。如果你不考慮任何安全問題,你很好去。祝你好運。

+0

不要忘記,當重定向離開當前頁面時,也會調用此事件,而不僅僅是當用戶關閉他的瀏覽器時,這可能不合意。 –

+0

我知道,但我敢打賭,他並不關心它:) –

+0

只是值得一提的。 –

相關問題