2009-08-11 91 views
1

我有一個方法,我需要在Session_end上運行。有什麼方法可以確保用戶關閉瀏覽器時運行代碼?這可能是一個重要的問題。我看到一個響應正在調用ajax卸載或某個東西,但是我不希望在用戶關閉瀏覽器時每次用戶離開頁面時都會觸發它。Session_End代碼在瀏覽器關閉

感謝, 〜CK

+2

ASP.NET會話狀態與用戶何時或如果關閉瀏覽器無關。 – 2009-08-11 21:01:10

+3

另請注意,Session_End只會觸發In-Proc模式 – TWith2Sugars 2009-08-11 21:22:47

回答

2

答案很簡單:你無法控制用戶的瀏覽器。您提到的AJAX解決方案是您可以實現的最接近(無需插件/自定義客戶端)。想象一下,每次打開和關閉瀏覽器窗口時都可以跟蹤某個網站。你不覺得這會是一個隱私問題嗎?

真相在於HTTP的無狀態本質。 Web服務器在完成將響應發送到客戶端後就不在圖片中。在那之後,所有你可以信賴的是客戶端腳本(它只執行,因爲客戶端需要它;並且它可以容易地選擇不運行腳本)。

2

Session_end是不可靠的。無論你做什麼。

Session_end僅在使用進程會話時觸發。如果您正在使用會話狀態服務器或SQL會話,則session_end不會觸發。

在進程會話中使用時,只有在會話中存儲了某些內容時纔會觸發session_end。如果你不使用會話,session_end永遠不會觸發。

如果您正在使用會話並且用戶關閉瀏覽器,那麼當用戶會話超時時,會觸發session_end。雖然它將具有與原始會話相同的設置,但該事件不會綁定到瀏覽器,因爲它是檢測會話超時並觸發session_end進程的工作進程。

+0

如果是這樣,它不在瀏覽器和服務器之間。一旦會話結束,我們可以依靠Session_end在不久的將來在某個地方開火。所以,如果我有一個靜態的計數器,我可以統計有多少會話仍然處於活動狀態。 – Bergkamp 2015-06-10 10:38:11

+0

該計數器通常會偏高。它將包括關閉瀏覽器但會話尚未超時的用戶的會話。 – 2015-06-10 12:29:43

+0

如果您可以請解釋「偏高」。另外,我目前在我的網站上構建一個聊天應用程序,並希望有一個靜態的用戶列表,以便我可以檢索所有名稱和ID。所以,稍後知道用戶已經註銷並不是那麼糟糕。沒有? – Bergkamp 2015-06-11 09:44:48