none
Response.Redirectを行う場合の正しい方法 RRS feed

  • 全般的な情報交換

  • ASP.NETでリダイレクトを行う場合はResponse.Redirectを実行しますが、その際パフォーマンス上の理由で第2引数をfalseにすることが推奨されています。

    ※さらにその後、HttpApplication.CompleteRequestを呼び出して、残りのイベント処理などをすっ飛ばしなさい、という感じ

    第2引数をfalseにすると、Redirect実行時にThreadAbortExceptionがスローされなくなり、例外のハンドリングによるパフォーマンスへの悪影響が避けられるという理由ですが(その理由はまあいいとして)、この場合、ページ処理は終了されず、残りの処理が実行されることになります。

    で、HttpApplication.CompleteRequestですが、これを実行しても、ASP.NETのイベントやフィルタはすっ飛ばされるが、ページ処理(Pageハンドラ処理中に実行される各ページ処理)はすっ飛ばされない気がするので、残りのページ処理は全部実行されるように思われます。

    ※実は各ページイベント等では、CompleteRequestが実行されたかチェックしてページイベントをバイパスとかしてる?

    もう一つ気になることとして、HttpApplication.CompleteRequestは残りのすべてのイベントとフィルタ処理を省略して直接EndRequestを実行させるとあり、この場合、セッションの保存イベントもすっ飛ばされるように読めます。

    InProcでは実装上このイベントはすっ飛ばされても影響ありませんが、外部に保存したセッション情報は、書き込みのタイミングを逸してしまうように思えます。

    ※当然それだと問題のはずなので実はそのあたりはうまく処理されている?

    とまあ、いろいろ気になることがあって、多少悪影響があるのはわかっているが、残りのページ処理をしてしまったり、意図しない動作をするよりはましという考えで、第2引数をfalseにしないResponse.Redirectを使いたくなります。

    ※悪影響ではあっても、通常はスタックの浅いところで実行されますし、この処理が問題になるほどパフォーマンスを突き詰めていない場合も多いため(というか、こんなことよりその他の処理のほうがよっぽどパフォーマンスに影響を与えていたりするので)

    で、上記疑問点などについて、詳細をご存知の方、あるいは情報源などご存知の方いらっしゃれば教えていただきたいです。

    • 種類を変更済み 星 睦美 2015年4月23日 4:22
    2015年4月16日 5:18