2012-04-06 21 views
0

Global.asaxのSession_Endイベントにユーザーデータを記録するコードがあります。動作していますが、「無効な操作です。接続が閉じられました」という例外がスローされることがあります。私は開発サーバー上でこの状況を再現することに失敗しました。アプリケーションサーバーでのみ発生します。なにが問題ですか?ありがとう。NHibernateは "無効な操作です。接続が閉じられました。"例外

protected void Session_End(object sender, EventArgs e) 
    { 
     try 
     { 
      userlog = UserLog.LoadBySessionAndLogoutTime(NHibernateHTTPModule.CurrentSession, Session.SessionID, null); 
      userlog.LogoutTime = DateTime.Now; 
      UserLog.Update(NHibernateHTTPModule.CurrentSession, userlog); 
     } 
     catch (Exception exception) 
     { 
      Mail.SendMail("Error", error); 
     } 
    } 

答えて

1

nhibernateセッションを開いたり閉じたりする場所を説明すると役立ちます。逆の場合を除き、私はあなたが「View Session in View」パターンを使用すると仮定します。

ユーザーセッションは要求の範囲外で終了するため、各要求でnhibernateセッションを開くと、ログオンしようとすると利用できなくなります。

ログインする前に開いているnhibernateセッションがあるかどうかを確認する必要があります。アクティブでない場合は、新しいものを開く必要があります。

+0

私は各http要求でnhibernateセッションを開いて閉じています。私はIHttpModuleを継承するNHibernateHTTPModuleを持っていて、OnBeginRequestで開いてOnEndRequestイベントを閉じています。あなたの提案を前に試してみましたが、nhibernate接続状態が閉じているかどうかを確認するコントロールを配置しましたが、閉じていても運がない場合は再オープンします。 – user487533

+0

そこに新しいnhibernateセッションを開くと、同じエラーがスローされますか? –

+0

ありがとうございます。私は新しいセッションを再開しますが、それは私に同じエラーを与え続けます。私はまた新しいものを開くことによって接続を再開しようとしましたが、いいえ。それは同じエラーを与え続けます。 – user487533

0

あなたのコードのどこかにHibernate操作に関する例外がスローされました。 すべて NHibernate例外はセッションを無効にします。

したがって、アプリケーションサーバーには、開発環境とは異なるエラーが発生する条件があります。あなたは、アプリケーション・サーバー上でログインを試みることができる:

protected void Application_Error() 
{ 
    Exception myError = null; 
    if(HttpContext.Current.Server.GetLastError() != null) 
    { 
     // log error 
     myError = Server.GetLastError(); 
     .... 
    } 
} 

Global.asaxの中で、あなたがそれらをログに記録することができますので、すべてのエラーをインターセプトします。

+0

これはあなたの問題に対する論理的な答えです。あなたのNhibernateトランザクションの1つでエラーが発生し、その後にセッションが閉じられます。ロギングする前にセッションが存在するかどうかを確認してください。 – Baz1nga

+0

私はApplication_Errorイベントを試みます。 Baz1nga、私はログオン前にセッションが存在するかどうかを確認しようとしましたが、もし存在しなければ再初期化されましたが、私は運がありませんでした。 – user487533

関連する問題