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