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 ハンドラーでセッションがスムーズに閉じられ、セッションが既に閉じられていないという例外がスローされます。