1. 程式人生 > >關於觸發asp.net Global.asax Session_End事件的經驗

關於觸發asp.net Global.asax Session_End事件的經驗

   在做asp.net程式設計開發的時候,我遇見這樣的問題,一個使用者只能在一臺機器上登入,

如果有使用者在其他機器上登入,系統將提示該使用者已經登入!當前登陸非法!我的做法是:

用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處理!