11

この問題はこの投稿に関連しているようですが、スレッドから解決策を推測することはできませんでした。

継承したアプリケーションでこのコードに気づきました(ログファイルで例外が発生していることに気付いた後):

    protected void Session_End(object sender, EventArgs e)
    {
        try
        {
            FormsAuthentication.SignOut();
            FormsAuthentication.RedirectToLoginPage();
            //if (this.Context.Handler is IRequiresSessionState || this.Context.Handler is IReadOnlySessionState)
            //{
            //    FormsAuthentication.SignOut();
            //    FormsAuthentication.RedirectToLoginPage();
            //}
        }
        catch (Exception ex)
        {
            this.GetType().GetLogger().Error(ex);
        }
    }

私はいくつかのことを疑問に思っています。まず、SignOutはどのようにnull参照例外をスローしますか?それは例外的なケースですか、それともプログラムで本質的に間違ったことをしていますか?次に、この例外がスローされる前に、この例外を回避するために何をテストする必要がありますか?

15:51:57,288 [13]エラーASP.global_asax-System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。System.Web.Security.FormsAuthentication.SignOut()のMvcApplication.Session_End

ありがとう

4

1 に答える 1

16

Session_Endこれは、HTTPリクエストのコンテキストで必ずしも実行されるとは限らないことを理解することが重要です。セッションがタイムアウトしたときに実行される場合があります。その時点では、クライアントに何も送信できません。これは、クライアントがもう存在しないためです。

したがって、のフォーム認証Cookieを削除しようとしないでくださいSession_End。必要に応じて、アプリケーションのどこかで[サインオフ]ボタンがクリックされたときに、それをより早く実行する必要があります。タイムアウトが発生した後にユーザーのフォーム認証チケットを期限切れにする必要がある場合は、構成ファイルでCookieの有効期限を適切に(おそらくセッションタイムアウト値と同等に)設定する必要があります。

于 2011-07-06T23:26:02.123 に答える