ThreadAbortException は、Response.End、Response.Redirect、または Server.Transfer を使用する場合に発生します。
この記事は、Response.End
、Response.Redirect
、またはServer.Transfer
を使用した場合に発生するThreadAbortException
エラーを解決するのに役立ちます。
元の製品バージョン:.NET Framework 4.6.2 以降の ASP.NET、.NET Framework 3.5 Service Pack 1 の ASP.NET
元の KB 番号: 312629
現象
Response.End
、Response.Redirect
、またはServer.Transfer
メソッドを使用すると、ThreadAbortException
例外が発生します。
try-catch
ステートメントを使用して、この例外をキャッチできます。
原因
Response.End
メソッドは、ページの実行を終了し、アプリケーションのイベント パイプラインのApplication_EndRequest イベントに実行をシフトします。
Response.End
に続くコード行は実行されません。
この問題は、両方のメソッドが内部的に Response.End を呼び出しているため、 Response.Redirect
メソッドと Server.Transfer
メソッドで発生します。
解決方法
この問題を回避するには、次のいずれかの方法を使用します。
Response.End
の場合は、Response.End
の代わりにHttpContext.Current.ApplicationInstance.CompleteRequest
メソッドを呼び出して、Application_EndRequest
イベントへのコード実行をバイパスします。Response.Redirect
の場合は、endResponse パラメーターに false を渡すオーバーロード Response.Redirect(String url, bool endResponse) を使用して、Response.End
の内部呼び出しを抑制します。 例えば次が挙げられます。Response.Redirect ("nextpage.aspx", false);
この回避策を使用すると、
Response.Redirect
に続くコードが実行されます。Server.Transfer
の場合は、代わりにServer.Execute
メソッドを使用します。
この例外 ASP.NET 処理されますが、 try-catch
ステートメントを使用してこの例外をキャッチできます。 例えば次が挙げられます。
try
{
Response.Redirect("nextpage.aspx");
}
catch (Exception ex)
{
Response.Write (ex.Message);
}
Response.Write
行にブレークポイントを追加し、このブレークポイントがヒットしたことを確認します。 例外を調べると、 ThreadAbortException
例外が発生していることに注意してください。