Nhibernate 使用会话结束事件进行用户日志记录

Nhibernate 使用会话结束事件进行用户日志记录,nhibernate,authentication,logging,sessionid,Nhibernate,Authentication,Logging,Sessionid,我有一个自动化系统,我想记录用户登录和注销。因此,我编写了一个工作几乎完美的代码。首先,我用以下代码段记录用户登录: if (UserLog.LoadByUserAndSessionAndLogoutTime(NHibernateHTTPModule.CurrentSession, user, Session.SessionID, null) == null) { UserLog userlog = new UserLog(); userlog.Lo

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

   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);
            }
IList userlogs=UserLog.LoadBySessionAndLogoutTime(NHibernateHTTPModule.CurrentSession,Session.SessionID,null);
foreach(用户日志中的用户日志)
{
userlog.LogoutTime=DateTime.Now;
Update(NHibernateHTTPModule.CurrentSession,UserLog);
}

现在,这个技巧很有效,但是当我在一天结束时检查数据库时,我有一些僵尸记录,它们有登录时间,但没有注销时间。很明显,对于某些用户来说,要么会话结束没有启动,要么发生了阻止更新的其他情况。我错过了什么?为什么这不能正常工作?提前谢谢。注意:我正在使用NHibernate。

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

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