1

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

   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。

4

1 回答 1

1

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

于 2012-04-05T21:48:35.817 回答