2012-04-05 69 views
1

我有一個自動化系統,我想記錄用戶登錄和註銷。因此,我寫了一個幾乎完美的代碼。首先,我錄製這一段代碼在用戶登錄:用戶記錄Session_End事件

if (UserLog.LoadByUserAndSessionAndLogoutTime(NHibernateHTTPModule.CurrentSession, user, Session.SessionID, null) == null) 
    { 
     UserLog userlog = new UserLog(); 
     userlog.LoginTime = DateTime.Now; 
     userlog.LogoutTime = null; 
     userlog.User = (Business.Classes.User)Session["User"]; 
     userlog.Session = Session.SessionID; 
     userlog.IPAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"]; 
     UserLog.Insert(NHibernateHTTPModule.CurrentSession, userlog); 
    } 

然後,在Global.asax中的Session_End中的事件,我寫了這個代碼塊;現在

  IList<UserLog> userlogs = UserLog.LoadBySessionAndLogoutTime(NHibernateHTTPModule.CurrentSession, Session.SessionID, null); 
      foreach (UserLog userlog in userlogs) 
      { 
       userlog.LogoutTime = DateTime.Now; 
       UserLog.Update(NHibernateHTTPModule.CurrentSession, userlog); 
      } 

,這一招效果很好,但是當我在一天結束的時候檢查數據庫,我有已登錄的時間,但沒有註銷時間有些殭屍記錄。很明顯,對於某些用戶來說,Session_End不會觸發或發生其他情況,從而阻止更新。我錯過了什麼?爲什麼這不能正常工作?提前致謝。注意:我正在使用NHibernate。

回答

1

好的,好吧,經過幾天的分析,我終於找到了問題。這是NHibernate的超時量。 NHibernate和Application的超時都設置爲十五(15)分鐘。如果用戶沒有通過正確的方式關閉應用程序(我的意思是使用註銷按鈕),那麼該用戶將在成功接聽電話後的十五分鐘內登錄系統。經過十五分鐘後,Session_End事件已被觸發以更新用戶登錄數據庫,但由於NHibernate超時也設置爲十五分鐘,有時由於執行Session_End中數據庫更新行之前超時而關閉NHibernate會話。因此,將NHibernate的超時設置爲十六(16)分鐘解決了問題。