0

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

4

2 に答える 2

1

We are using IHttpModule, this way:

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
        }

        ...
}

And in web.config

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

EDIT: About commit and close session (but we are using a lot of Helper and Services...)

    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 に答える