この記事は、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 例外が発生していることに注意してください。