0

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

    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);
        }
    }
4

2 に答える 2

1

nhibernate セッションを開いたり閉じたりする場所を説明していただけると助かります。反対のことを言わない限り、「Open Session in View」パターンを使用していると想定します。

ユーザー セッションはリクエストの範囲外で終了するため、各リクエストで nhibernate セッションを開くと、ログに記録しようとしても使用できません。

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

于 2012-04-06T13:56:45.793 に答える
0

チャンスは、NHibernate操作がコードのどこかにスローされたことに関連する例外です。NHibernateの例外があると、セッションが無効になります。

そのため、アプリケーションサーバーには、開発環境とは異なる、エラーの原因となる条件がいくつかあります。アプリケーションサーバーにログを記録してみてください。

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

global.asaxはすべてのエラーをインターセプトするため、ログに記録できます。

于 2012-04-06T15:39:12.610 に答える