我有一个代码片来记录Global.asax的Session_End事件中的用户数据。它正在工作,但有时会抛出“无效操作。连接已关闭”异常。我没能在开发服务器上复制这种情况。它只发生在应用程序服务器上。怎么了?谢谢。
protected void Session_End(object sender, EventArgs e)
{
try
{
userlog = UserLog.LoadBySessionAndLogoutTime(NHibernateHTTPModule.CurrentSession, Session.SessionID, null);
userlog.LogoutTime = DateTime.Now;
UserLog.Update(NHibernateHTTPModule.CurrentSession, userlog);
}
catch (Exception exception)
{
Mail.SendMail("Error", error);
}
}
答案 0 :(得分:1)
如果您解释打开和关闭nhibernate会话的位置,将会有所帮助。除非你说相反,否则我会假设你使用“在视图中打开会话”模式。
用户会话在请求范围之外结束,因此如果您在每个请求上打开一个nhibernate会话,则在您尝试登录时它将无法使用。
您应该在记录之前验证是否已打开nhibernate会话。如果没有活动,您将需要打开一个新的。
答案 1 :(得分:0)
可能是一个与NHibernate操作有关的异常被抛到代码中的某个地方。 任何 NHibernate异常都会使会话无效。
因此,应用程序服务器上的某些条件与您的开发环境不同,导致错误。您可以尝试在应用程序服务器上记录它:
protected void Application_Error()
{
Exception myError = null;
if(HttpContext.Current.Server.GetLastError() != null)
{
// log error
myError = Server.GetLastError();
....
}
}
global.asax中的将拦截所有错误,以便您可以记录它们。