次の方法で共有


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

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

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

現象

Response.EndResponse.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 例外が発生していることに注意してください。