我在 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引发异常。