0

我有一段代码可以在 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);
        }
    }
4

2 回答 2

1

如果你解释你在哪里打开和关闭你的 nhibernate 会话会有所帮助。除非您说相反,否则我会假设您使用“在视图中打开会话”模式。

用户会话在请求范围之外结束,因此如果您在每个请求上打开一个休眠会话,则在您尝试登录时它将不可用。

您应该在登录之前验证您是否打开了休眠会话。如果没有一个处于活动状态,您需要打开一个新的。

于 2012-04-06T13:56:45.793 回答
0

有可能在您的代码中某处引发了与 NHibernate 操作相关的异常。任何NHibernate 异常都会使会话无效。

因此,应用程序服务器上的某些条件与您的开发环境不同,会导致错误。您可以尝试将其记录在应用程序服务器上:

protected void Application_Error()
{
    Exception myError = null;
    if(HttpContext.Current.Server.GetLastError() != null)
    {
        // log error
        myError = Server.GetLastError();
        ....
    }
}

在 global.asax 中将拦截所有错误,以便您记录它们。

于 2012-04-06T15:39:12.610 回答