用户使用Session_End事件记录

时间:2012-04-05 12:07:21

标签: nhibernate authentication logging sessionid

我有一个自动化系统,我想记录用户登录和注销。因此,我写了一个近乎完美的代码。首先,我用这段代码记录用户登录:

   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 个答案:

答案 0 :(得分:1)

好吧,好吧,经过几天的分析,我终于找到了问题所在。它是NHibernate的超时量。 NHibernate和Application的超时时间设置为十五(15)分钟。如果用户没有通过正确的方式关闭应用程序(使用我的意思是退出按钮),那么用户将在成功的get-set调用后登录系统十五分钟。传递十五分钟后,Session_End事件已被触发以更新用户登录数据库,但由于NHibernate超时也设置为十五分钟,有时NHibernate会话由于在Session_End执行数据库更新行之前超时而关闭。因此,将NHibernate的超时设置为十六(16)分钟就解决了这个问题。