【发布时间】:2012-11-02 18:37:19
【问题描述】:
我在 ASP .NET Web 窗体应用程序中使用 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 处理程序中顺利关闭,并且不会引发 会话已关闭 异常。
【问题讨论】:
-
ISession 是 IDisposable,因此您应该更愿意在其上调用 Dispose()。那个版本的NH真的很老了,也是NH 3系列的第一部,也许你应该尝试升级一下。
-
谢谢。我使用了 Dispose 仍然是一样的。我设法发现的是,显式事务会导致问题。我会更新问题。
-
这很奇怪......事务应该总是“显式”以获得最佳兼容性,所以这个故事肯定有更多内容。
-
可能有一些错误处理程序会关闭会话?
-
我不这么认为。我从第一行代码编写了那个应用程序:)
标签: asp.net nhibernate ado.net