我使用Application_Error
來處理ASP.NET MVC 3應用程序中的錯誤。今天我注意到,對於一個特定的錯誤情況,該方法被調用兩次:當請求具有前導下劃線的資源時,例如, _ViewStart.cshtml
。ASP.NET Application_Error被調用兩次
的Application_Error
實施消耗的最後一個服務器錯誤:
var exception = server.GetLastError();
server.ClearError();
...
因此,當它被稱爲第二次,GetLastError
回報null
。當它第一次被調用時,它會在響應對象上設置相應的狀態碼和內容。第二次調用導致所有這些設置被覆蓋。要解決這個問題,我現在檢查空指針:
if (exception == null) return;
這樣一來,它的工作原理完全正常:該方法的第一次運行取代由一個錯誤頁面的響應,並設置狀態碼。第二次運行什麼都不做。然後將響應發送給獲取正確的狀態碼和錯誤頁面的客戶端。
但是這行代碼對我來說看起來很髒。我寧願瞭解發生了什麼,而不是讓錯誤處理程序靜靜地退出,而事實上一定是錯誤的。
請注意:在第一次運行錯誤處理期間,似乎沒有任何地方拋出異常。否則我可以理解它。但在逐行調試時,整個方法都會被處理,包括對控制器的MVC調用和視圖的渲染。事實上,在遵循gordonml的註釋並檢查「Break when CLR exception thrown」標誌後,Visual Studio從未中斷,甚至在第一次調用Application_Error之前都沒有中斷。
它有可能是由於二級請求而被調用的,例如頁面上另一個元素的請求或favicon.ico。您可以通過轉到Visual Studio中的調試菜單並單擊「例外」來強制調試器打破所有異常。從那裏你可以檢查「引發」的「公共語言運行時異常」。這將捕獲任何線程AFAIK上拋出的所有異常。 – gordonmleigh
@gordonml:情況並非如此。 Application_Error的這兩個調用發生在處理單個請求的過程中。兩個調用都具有相同的響應對象,這樣第二個調用可以放棄第一個調用寫入響應的任何內容。 – chiccodoro
這有什麼好運? @chiccodoro我有同樣的問題。 –