2008-08-15 54 views

回答

18

這可能是從Response.Redirect的調用來newbs借鑑。檢查此鏈接了一個解釋:

http://dotnet.org.za/armand/archive/2004/11/16/7088.aspx

(在大多數情況下,調用的Response.Redirect(網址,FALSE)解決了這個問題)

+5

請注意,上面的鏈接中斷 – JoshL 2011-07-27 21:57:12

+3

埃裏克的答案是正確的,但你應該知道,傳入false參數意味着當前線程不會中止,即將運行Response.Redirect之後的代碼。 – CodeClimber 2012-01-19 09:54:05

1

正如其他人所說,當您調用Response.End()(發生在調用Response.Redirect而不傳遞false作爲第二個參數時)時會發生。這是按設計工作的;通常,如果您調用Response.Redirect,則希望重定向立即發生。有關更多信息,請參見本:

Response.Redirect and the ThreadAbortException

0

知道有(至少)三個API在內部使用Thread.Abort,我想回答的更實際的方面,如何制定出如何對待它。

對我們來說,這個錯誤開始突然被記錄下來。什麼改變了?我們修復了一些處理站點地圖的數據庫程序中的錯誤。

log4net日誌顯示X-Forwarded-For標題(我們在NLB後面)是Googlebot的IP地址66.249.78.x,這增強了我對於網站地圖變化的理論,這些理論導致Google抓取我們的網站更積極地尋找圖像。

首先要弄清楚爲什麼只有Googlebot能夠導致這個問題。沒有其他客戶端觸發任何代碼路徑使用Response.Redirect,或其他。

因此,在HttpApplication.Error處理程序中,我添加了一些代碼以記錄所有標題的額外詳細輸出,並且HttpResponseHttpContext中的大部分數據都被記錄下來。

這讓我看到的問題是,Googlebot的是使用iPhone的用戶代理字符串,並與武裝,我可以搜索代碼庫的「iPhone」,並拿出:

private void CheckIPhoneAccess() { ... } 

而且使用重定向。

該怎麼辦?

好吧,對於這個老化的代碼庫,它不值得修復所有的Response.Redirect調用,所以我要降低應用程序的日誌級別ThreadAbortException

我將改變Googlebot的移動抓取工具的行爲,這將導致什麼我們的網站用於手機,因爲它只是重定向的第一擊「的謊言」,隨後它讀取一個cookie,並顯示圖像。 Googlebot似乎無法緩存該Cookie。

這並不完美,但該網站將被重建。可能是由另一個團隊使用Scala或其他東西,所以實際上,我認爲這是一個不錯的選擇。我會添加註釋和後可重新回到這個問題,建立一個Response.SafeRedirect擴展封裝忠告:

Why Response.Redirect causes System.Threading.ThreadAbortException?

盧克

0

爲什麼Response.Redirect的會給這個異常的原因是asp.net使用Thread.Abort()在內部實現此API。當這個方法被調用時,會拋出一個特殊的ThreadAbortException。這個異常不會被任何catch塊吞噬。它將被重新扔在每個catch塊的末尾。

相關問題