ThreadAbortException は、Response.End、Response.Redirect、または Server.Transfer を使用する場合に発生します。

この記事は、または Server.Transferを使用Response.EndResponse.Redirectする場合に発生する ThreadAbortException エラーを解決するのに役立ちます。

元の製品バージョン: .NET Framework 4.5.2 の ASP.NET、.NET Framework 3.5 Service Pack 1 の ASP.NET
元の KB 番号: 312629

現象

Response.Redirect、または Server.Transfer メソッドをResponse.End使用すると、ThreadAbortException 例外が発生します。 ステートメントを try-catch 使用して、この例外をキャッチできます。

原因

メソッドは Response.End ページの実行を終了し、アプリケーションのイベント パイプラインのApplication_EndRequest イベントに実行をシフトします。 次 Response.End のコード行は実行されません。

この問題は、両方のメソッドが Response.End を内部的に呼び出すので、 メソッドと Server.Transfer メソッドでResponse.Redirect発生します。

解決方法

この問題を回避するには、次のいずれかの方法を使用します。

  • の場合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 例外が発生していることに注意してください。