0

我在 ASP .NET Web Forms 应用程序中使用 Session Per Request 方法。

这是请求结束时运行的代码,这就是我关闭会话的方式:

    protected void Application_EndRequest(object sender, EventArgs e)
    {
        ISession session = ManagedWebSessionContext.Unbind(HttpContext.Current, SessionFactoryProvider.SessionFactory);

        if (session != null)
        {
            if (session.Transaction != null && session.Transaction.IsActive)
            {
                session.Transaction.Rollback();
            }
            if (session.IsOpen)
            {
                session.Close();    
            }
        }
    }

很明显的东西。但是,我在调用session.Close时经常遇到异常。异常类型为SessionException,消息为:

{“会话已关闭”}

堆栈跟踪是:

   at NHibernate.Impl.SessionImpl.Close() in d:\CSharp\NH\nhibernate\src\NHibernate\Impl\SessionImpl.cs:line 343

我使用的 NHibernate 版本是:3.0.0.4000

我已经搜索过可以关闭会话的代码,但没有找到。此外,我还使用与会话对象无关的简单请求对其进行了测试,并且仍然相同。有什么想法可能是什么问题?

编辑:在分而治之的会议之后,我瞄准了一段负责该异常的代码

                    var session = SessionFactoryProvider.GetCurrentSession();
                    using (ITransaction tx = session.BeginTransaction())
                    {
                        session.Update(instrument);
                        tx.Commit();
                    }

如果我将其注释掉,则会话在 EndRequest 处理程序中顺利关闭,并且没有Session is already closed引发异常。

4

2 回答 2

1

我们正在使用IHttpModule,这样:

public class ModuleSessionNHibernate : IHttpModule
{
        public void Init(HttpApplication context)
        {
            context.BeginRequest += new EventHandler(BeginTransaction);
            context.EndRequest += new EventHandler(CommitAndCloseSession);
        }

        private void CommitAndCloseSession(object sender, EventArgs e)
        {
            // commit or rollback depending on errors
            // then close session
        }

        ...
}

在 web.config 中

<httpModules>
    <add name="NHibernateSessionModule" type="XXX.ModuleSessionNHibernate, XXX"/>
</httpModules>

编辑:关于提交和关闭会话(但我们使用了很多助手和服务......)

    private void CommitAndCloseSession(object sender, EventArgs e)
    {
        try
        {
            if (no exception in context)
            {
                // commit transaction
            }
            else
            {
                // rollback transaction
            }
        }
        finally
        {
            try
            {
                // close session
            }
            catch (Exception ex)
            {
                // send email                       
            }

                // rollback
                // close

                throw;
            }
        }
    }
于 2012-10-31T08:50:19.660 回答
1

通过迁移到 NHibernate 3.3.1 解决了问题。

然而,另一个问题浮出水面:

找不到属性 - 从 NHibernate 3 切换到 3.3.1 后出现异常

于 2012-11-02T10:37:19.727 回答