1. ホーム
  2. c#

[解決済み】Response.RedirectでSystem.Threading.ThreadAbortExceptionが発生するのはなぜか?

2022-04-02 22:43:36

質問

Response.Redirect(...)を使ってフォームを新しいページにリダイレクトすると、エラーが発生します。

mscorlib.dll で 'System.Threading.ThreadAbortException' 型の最初の例外が発生しました。

mscorlib.dll で 'System.Threading.ThreadAbortException' 型の例外が発生したが、ユーザーコードでは処理されなかった。

私の理解では、このエラーは、response.redirect が呼び出されたページの残りをウェブサーバーが中止したために発生したものだと思います。

に第2パラメータを追加できることは知っています。 Response.Redirect は、endResponse と呼ばれるものです。 endResponseをTrueに設定してもエラーは出ますが、Falseに設定すると出ません。 しかし、これはウェブサーバーが私がリダイレクトしたページの残りを実行していることを意味すると確信しています。 これは、控えめに言っても、非効率的だと思われます。 何か良い方法はないでしょうか? 何か Response.Redirect または、古いページの読み込みを強制的に停止する方法はありますか? ThreadAbortException ?

解決方法は?

正しいパターンは、Redirect オーバーロードを endResponse=false で呼び出し、制御を戻したら EndRequest ステージに直接進むように IIS パイプラインに指示する呼び出しを行うことです。

Response.Redirect(url, false);
Context.ApplicationInstance.CompleteRequest();

このブログの記事 Thomas Marquardt が、 Application_Error ハンドラ内でリダイレクトを行う特殊なケースの処理方法など、さらなる詳細を説明しています。