2015/5/15

[程式設計] ASP.NET – ThreadAbortException when using Response.End

最近在公司寫的網站程式出了一些怪問題,原本使用者可以正常從網頁下載 excel 檔案,並直接開啟檔案。可是當系統升級成 Win 7 + IE 10 之後,居然偶爾會出現 excel 檔案無法下載的問題,本來還以為是公司的網路出了問題,後來才發現可能是因為一行程式所引起。

這個問題是因為我們在網頁下載 excel 檔案之後,會用 Response.End 方法去結束掉整個網頁 request。後來在 log 裡面可以看到 ThreadAbortException 的錯誤,也因此讓我們有方向上網去找問題的解法。

上網查過之後,最直接的解法就是建議直接改成呼叫 HttpContext.Current.ApplicationInstance.CompleteRequest 方法,而不是呼叫 Response.End。看到這樣的解法,馬上試了一下,果然就不會發生錯誤了。不過因為目前只有在一個使用者上驗證過,還待時間來驗證解法是否正確。

相同的問題除了發生在 Response.End 之外,還有使用 Response.Redirect和Server.Transfer 這兩個方法都有可能會發生 ThreadAbortException 的錯誤,因為這兩個方法在內部程式邏輯都是會去呼叫 Response.End 這個方法,所以當然也會發生一樣的問題。

相關連結:

Microsoft KB 312629 : ThreadAbortException 會發生在使用 Response.End、 Response.Redirect 或 Server.Transfer

Is Response.End() considered harmful? – StackOverflow

Correct use of System.Web.HttpResponse.Redirect – MSDN Blogs

沒有留言:

張貼留言