読者です 読者をやめる 読者になる 読者になる

misc.log

日常茶飯事とお仕事と

Response.EndでThreadAbortExceptionが起きる

ASP.NET 業務日誌.NET 業務日誌

下記エントリで書いていたコードに、実行ログを出力させよう!とlog4net出力コードを埋め込み、さらに「エラー処理も(エラー起きないだろうけど)やっておこう!」と張り切ってTry/Catchで囲ったら……エラー出てるし……

backyard.hatenablog.com

エラー内容

出てるエラーはこんな感じ

2015-04-14 19:09:33,119 [10] INFO  - ■ Button_Click 開始
2015-04-14 19:09:33,146 [10] ERROR - エラー発生
System.Threading.ThreadAbortException: スレッドを中止しようとしました。
   場所 System.Threading.Thread.AbortInternal()
   場所 System.Threading.Thread.Abort(Object stateInfo)
   場所 System.Web.HttpResponse.End()
   場所 OfficeFileDownloadTest._Default.Button_Click(Object sender, EventArgs e) 場所 C:\Users\test\Documents\Visual Studio 2008\Projects\Test\Test\Default.aspx.cs:行 248

なんなのこれ?と思い、軽く検索するとこんなのが引っかかった。あとで詳細調べます。

PRB/ ThreadAbortException Occurs If You Use Response.End, Response.Redirect, or Server.Transfer
https://support.microsoft.com/en-us/kb/312629/

とりあえず、Response.Endの代わりにこれを書いて回避してみます。

HttpContext.Current.ApplicationInstance.CompleteRequest();

CompleteRequesetもダメだ

エラーは消えましたが、TransmitFileでファイルをダウンロードしたほうは、どうもファイル内に余計なタグがついたか何かでファイル表示時に修復の問い合わせがでるように。

また、Response.WriteでHTMLを返していた方は、なんとダウンロードされる内容がASP.NETが作ったページそのままをコピーしたExcelファイルに。HTMLの記述内容はどこかに行ってしまいました。

前者はおそらくこれです。

HttpResponse.WriteとかWriteFileするとデフォルトで付いてしまう
https://social.msdn.microsoft.com/Forums/ja-JP/b7b5e136-e8bd-457b-8993-aaa9893902ae/httpresponsewritewritefiledoctype-html-public-w3cdtd-?forum=aspnetja

上記のフォーラム内で「aspxを使わずに、ashxファイルつかってProcessRequestの中で同じことやればいいように思いますが。」といったコメントがあるので、このあたりを調べてみます。

いずれにしても、現時点ではResponseオブジェクトによるデータ返送の仕組みを調べるのは完全に脱線で、Excelデータをダウンロードするテストページを作ることがもくてきなので、とりあえずエラートラップをはずしてResponse.Endでやって行こうと思います。

分かりやすい説明があった

ここにわかりやすく書いてありました。もう少し噛み砕いてみますが、すこしすっきり。

ThreadAbortExceptionの回避策について
http://www.ailight.jp/BBSDetail/Index/08988dba-817c-4d2d-a64e-98159ccfd47c