在有些應用中我們需要實時的更新站點用戶是否在線的狀態。比如一些論壇里的在線成員實時顯示,或基于網頁的聊天、會議系統等。這種情況下,如果用戶點擊“退出”按鈕或鏈接,我們將之行一系列后臺操作,將該用戶標識成off line狀態;但如果用戶直接關閉瀏覽器的話,就需要我們想辦法來更新用戶的狀態。
?
下面是我總結的幾種解決方案,請高手們指教:
?
第一類:服務端解決
?
1.如果Session是InProc的話,那么在不需要嚴格實時的應用中,使用 session_end 事件+合理的Session生命期 是最好的選擇
?
我們都知道,在用戶瀏覽器打開網頁,訪問我們的ASP.NET程序時,服務器會根據瀏覽器分配給客戶端一個全局唯一的SessionID,同時執行Global.asax中的Session_Start事件, 當瀏覽器關閉或我們在WebConfig中設置的Session生命期過期時,將會關閉這個會話,同時執行?Session_End 事件。
據此,如果用戶關閉瀏覽器,我們則可以在Session_End事件中執行將該用戶標識成offline的代碼。
?
第二類:客戶端解決
?
相比服務端解決方案,客戶端解決方案比較繁瑣復雜(需要在所有相關頁面中設置),而且很有局限性,但在一些特殊的應用中也是非常適合的。
?
1.捕獲onbeforeunload或onunload事件
?
如果我們在<body>中設置了onbeforeunload或onunload事件函數,那么當瀏覽器關閉時,將會先后執行這兩段JavaScript方法,據此,在一些實時性要求很高的應用中,比如在線會議,如果用戶關閉了頁面,需要馬上將狀態反饋給服務端。這種情況下,我們可以在JavaScript方法中調用WebService來告訴服務端,用戶已經offline了。
?
為了提高Javascript代碼的效率,我們可以用捕獲鼠標關閉事件來判斷是用戶點擊了“X”關閉頁面,還是其它情況下的離開頁面,代碼如下:
?






?
?
2.定時向服務器匯報狀態
?
在上一種客戶端方案中,如果客戶端突然斷電,則可能無法及時更新狀態。
我們知道,在JavaScript中有類似于Timer的setInterval和setTimeout函數,我們可以利用這個函數來每隔一段時間之行一段代碼:
?




?
據此,我們可以在客戶端每隔一段時間到服務器匯報在線狀態,如果一定時間內服務器接收不到客戶端的狀態更新,則視為offline
?
3.非AJAX的方法
?
使用傳統表單提交的方法貌似可以達成,以下代碼來自palanisaami ,但未經測試
?
?







?
?
?