プログラマーな日々

プログラマーをやっています。好きなものは、C#, TaskChute Cloud, WorkFlowy, Backlog, AWSです。

Response.Endを呼び出すと必ずThreadAbortExceptionが発生する

こんなバグがありました。

protected new void Page_Load(object sender, EventArgs e) {
   try {
       /*
        * HttpResponse.TransmitFileでファイルの内容を応答に書き込む処理
        */
       Response.End();
   } catch (Exception){
       Response.Clear();
       Response.StatusCode = 500;
       Response.End();
   }
}

上記のコードは必ず500エラーになります。

Response.Endを呼び出すとThreadAbortExceptionが発生するからです。これは仕様です。

End、Redirect、および Transfer の呼び出しにより、現在の応答が途中で終了すると、ThreadAbortException 例外が発生します。

HttpResponse.End メソッド (System.Web)
現在バッファリングされているすべての出力をクライアントへ送信し、ページの実行を停止して、EndRequest イベントを発生させます。

修正後

以下のように実装する必要があります。

protected new void Page_Load(object sender, EventArgs e) {
   try {
       /*
        * HttpResponse.TransmitFileでファイルの内容を応答に書き込む処理
        */
       Response.End();
   } catch (ThreadAbortException) {
       // 何もしない。
   } catch (Exception){
       Response.Clear();
       Response.StatusCode = 500;
       Response.End();
   }
}