NHibernate抛出“无效操作。连接已关闭。”例外

时间:2012-04-06 10:50:51

标签: asp.net database nhibernate session logging

我有一个代码片来记录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);
        }
    }

2 个答案:

答案 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中的

将拦截所有错误,以便您可以记录它们。