1

自動化システムがあり、ユーザーのログインとログアウトを記録したいと思います。したがって、私はほぼ完璧に機能するコードを書きました。まず、次のコードでユーザーログインを記録します。

   if (UserLog.LoadByUserAndSessionAndLogoutTime(NHibernateHTTPModule.CurrentSession, user, Session.SessionID, null) == null)
    {
        UserLog userlog = new UserLog();
        userlog.LoginTime = DateTime.Now;
        userlog.LogoutTime = null;
        userlog.User = (Business.Classes.User)Session["User"];
        userlog.Session = Session.SessionID;
        userlog.IPAddress = HttpContext.Current.Request.ServerVariables["REMOTE_ADDR"];
        UserLog.Insert(NHibernateHTTPModule.CurrentSession, userlog);
    }

次に、Global.asaxのSession_Endイベントで、このコードピースを記述しました。

            IList<UserLog> userlogs = UserLog.LoadBySessionAndLogoutTime(NHibernateHTTPModule.CurrentSession, Session.SessionID, null);
            foreach (UserLog userlog in userlogs)
            {
                userlog.LogoutTime = DateTime.Now;
                UserLog.Update(NHibernateHTTPModule.CurrentSession, userlog);
            }

さて、このトリックはうまく機能しますが、一日の終わりにデータベースをチェックすると、ログイン時間はあるがログアウト時間はないゾンビレコードがいくつかあります。一部のユーザーにとっては、Session_Endが起動しないか、更新を妨げる何か別のことが起こっていることは明らかです。私が欠けているものは何ですか?なぜこれが正しく機能しないのですか?前もって感謝します。注:私はNHibernateを使用しています。

4

1 に答える 1

1

わかりました。数日間分析した後、ようやく問題が見つかりました。NHibernateのタイムアウト量です。NHibernateとアプリケーションの両方のタイムアウトは15分に設定されています。ユーザーが正しい方法で(つまり、ログアウトボタンを使用して)アプリケーションを閉じない場合、そのユーザーは、get-set呼び出しが成功した後、15分間システムにログオンします。15分が経過した後、Session_Endイベントが発生してデータベースのユーザーログインを更新しましたが、NHibernateタイムアウトも15分に設定されているため、Session_Endのデータベース更新行が実行される前にタイムアウトしたためにNHibernateセッションが閉じられることがあります。したがって、NHibernateのタイムアウトを16分に設定すると、問題が解決しました。

于 2012-04-05T21:48:35.817 に答える