2011-07-06 8 views
9

この問題はthisポストに関連しているようですが、スレッドから解決策を推測できませんでした。私はいくつかのことを疑問に思ってFormsAuthentication.SignOut throw NullReferenceException

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:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 MvcApplication.Session_End

でSystem.Web.Security.FormsAuthentication.SignOutで ()

おかげ

答えて

14

それは、Session_Endは必ずしもHTTPリクエストのコンテキストで実行されないことを認識することが重要です。セッションがタイムアウトすると実行されることがあります。その時はクライアントに何も送ることはできません。なぜなら、それは単にもう存在しないからです!

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

+0

ああ...私はそれらの行に沿って何かを読んでいましたが、私は別の言葉でそれを読むまで理解しませんでした。それは、私はHttpContext.Currentの存在を検証する必要がありますか、エラーメッセージを食べることはSession_Endが発生したときの 'ランダム性'を処理するための受け入れ可能な手段ですか? –

+0

@Sean認証クッキーを削除するには 'Session_End'を使うべきです。それは別の目的を果たしており、あなたはそのコンテキストでサーバーサイドのものにアクセスすることしか想定できません。それに、なぜあなたは最初にそれを必要としますか?クッキーが期限切れになるようにするには、タイムアウトを設定することで期限切れにしてください。 –

+0

あなたの編集をお読みください。ありがとう。 –

関連する問題