關於觸發asp.net Global.asax Session_End事件的經驗
如果有使用者在其他機器上登入,系統將提示該使用者已經登入!當前登陸非法!我的做法是:
用Application變數儲存已經Login的使用者資訊,當Session_Start的時候,在Global.asax
檔案裡寫Session_Start事件響應函式,記錄登入使用者!當用戶Logout的時候,在Session_End
事件裡,將Application變數中的使用者資訊做一個休正,即:清除SessionEnd的使用者資訊。
問題出現了!Session_End無法執行???為什麼呢?後來看了幾篇文章,做了試驗,得出以下
結果,要讓Session_End事件響應,需要做以下工作:
首先在web.config檔案中需要有以下設定:
<sessionState
mode="InProc"
stateConnectionString="tcpip=127.0.0.1:42424"
sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"
cookieless="false"
timeout="1"
/>
Session_End只在mode="inProc"模式下觸發,timeout決定該事件的觸發時間,
一般情況下,timeout是指Session失效的時間,我在自己設計的asp.net應用系統中,
使用Form校驗方式,不需要Session來判斷使用者是否登入,所以設定timeout=1分鐘,
不會影響正常操作,但是如果使用者設計的系統使用Session來儲存使用者登入資訊,
設定timeout=1,那麼開啟瀏覽器後,當用戶在1分鐘內不在該瀏覽器上進行操作,
Session就會失效,這可能導致系統使用的不正常!對於一般使用者而言,對著螢幕
看1分鐘後,又要重新登陸一次,是個十分噁心的事情!
因此,如果使用Session來儲存使用者登入資訊,建議採用其他方式!
比如在每個Page上做一個onunload事件響應函式,如:oncloseIE(),當瀏覽器關閉的時候,
oncloseIE()執行,在oncloseIE函式裡使用ajax方式,呼叫後臺的server端函式,執行
Session.Abandon(); 這樣的方法將是最直接,最及時的Session End處理!