2011-04-15 89 views
8

不斷越來越這是由用戶啓動一個下載引起以下異常,並因此未能(或被取消):防止接受的方式「遠程主機關閉了連接」異常

Error Message : The remote host closed the connection. The error code is 0x80072746. Stack Trace : at System.Web.Hosting.ISAPIWorkerRequestInProcForIIS6.FlushCore(Byte[] status, Byte[] header, Int32 keepConnected, Int32 totalBodySize, Int32 numBodyFragments, IntPtr[] bodyFragments, Int32[] bodyFragmentLengths, Int32 doneWithSession, Int32 finalStatus, Boolean& async) at System.Web.Hosting.ISAPIWorkerRequest.FlushCachedResponse(Boolean isFinal) at System.Web.Hosting.ISAPIWorkerRequest.FlushResponse(Boolean finalFlush) at

我在互聯網上搜索過,and found an interesting article,但似乎沒有一個明確的答案作爲防止填滿日誌的最佳方法。

用戶看到沒有錯誤,並且應用程序中沒有實際問題,因爲它僅在(我理解的)情況下出現在不受控制的情況下(用戶取消下載或連接丟失),但必須有一種方法來防止這種例外被報道。

我討厭這麼說,但我很想去檢查這個異常,並且空的catch將它的屁股一掃而空 - 但是這讓我覺得自己像個髒兮兮的程序員。

因此 - 什麼是防止這種異常填補我的郵箱接受的方法?

+0

你需要說明用戶如何初始化下載?它是瀏覽器嗎?是否在AJAX?... – Aliostad 2011-04-15 15:43:45

+0

@ m.edmondson - 如果發生異常,那麼您需要捕捉它或調整您的設置,以避免每次發生此異常時都向您發送電子郵件。沒有完成的下載不應該導致這種情況。 – 2011-04-15 15:44:34

+0

它通過`System.Web.HttpResponse.TransmitFile()`啓動` – 2011-04-15 15:46:23

回答

2

您不能阻止遠程主機關閉任何東西。

而在某些協議中,這是說再見的正常(或至少被接受)的方式。

所以你將不得不處理這個特定的異常。

1

從實際角度來看,由於死機或死網會話取消下載沒有任何問題,因此捕獲遠程主機關閉的異常是完全可以接受的。

6

當您嘗試向客戶端發送響應但它們已斷開連接時發生此錯誤。您可以通過在Response.Redirect上設置斷點或將數據發送到客戶端的任何位置來驗證這一點,等待Visual Studio命中斷點,然後在IE中取消請求(使用位置欄中的x)。這應該會導致錯誤發生。

要捕獲您可以使用下面的錯誤:

try 
{ 
    Response.Redirect("~/SomePage.aspx"); 
    Response.End(); 
} 
catch (System.Threading.ThreadAbortException) 
{ 
    // Do nothing. This will happen normally after the redirect. 
} 
catch (System.Web.HttpException ex) 
{ 
    if (ex.ErrorCode == unchecked((int)0x80070057)) //Error Code = -2147024809 
    { 
     // Do nothing. This will happen if browser closes connection. 
    } 
    else 
    { 
     throw ex; 
    } 
} 

或者在C#6你可以用異常過濾器,以防止其重新拋出錯誤:

try 
{ 
    Response.Redirect("~/SomePage.aspx"); 
    Response.End(); 
} 
catch (System.Threading.ThreadAbortException) 
{ 
    // Do nothing. This will happen normally after the redirect. 
} 
catch (System.Web.HttpException ex) when (ex.ErrorCode == unchecked((int)0x80070057)) 
{ 
    // Do nothing. This will happen if browser closes connection. 
} 

哪個更好調試體驗,因爲它將停止在拋出異常的語句上,並且當前狀態和所有局部變量保存,而不是在catch塊內的throw上。

相關問題