2011-07-11 130 views
2

我使用Application_Error來處理ASP.NET MVC 3應用程序中的錯誤。今天我注意到,對於一個特定的錯誤情況,該方法被調用兩次:當請求具有前導下劃線的資源時,例如, _ViewStart.cshtmlASP.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之前都沒有中斷。

+2

它有可能是由於二級請求而被調用的,例如頁面上另一個元素的請求或favicon.ico。您可以通過轉到Visual Studio中的調試菜單並單擊「例外」來強制調試器打破所有異常。從那裏你可以檢查「引發」的「公共語言運行時異常」。這將捕獲任何線程AFAIK上拋出的所有異常。 – gordonmleigh

+0

@gordonml:情況並非如此。 Application_Error的這兩個調用發生在處理單個請求的過程中。兩個調用都具有相同的響應對象,這樣第二個調用可以放棄第一個調用寫入響應的任何內容。 – chiccodoro

+0

這有什麼好運? @chiccodoro我有同樣的問題。 –

回答

0

同樣的事情發生在我身上。

我的解決辦法如下(我不喜歡它,但我喜歡它比if(exception == null) return;

在該異常是一個Ajax調用服務器中拋出的情況下,我只是刪除了Response.StatusCode = (int)401

我曾在Global.asax.cs中找到過,因爲API訪問令牌有時會比http會話更早過期。如果我設置Response.StatusCode = 500,則Application_Error不會觸發兩次。

0

Web.config中有兩種可能性來定義自定義錯誤。確保只有其中一個存在,否則相應的錯誤會被調用兩次。

<httpErrors errorMode="Custom" defaultResponseMode="ExecuteURL"> 
    <error statusCode="404" path="/Error/NotFound" responseMode="ExecuteURL" /> 
    ... 
</httpErrors> 


<customErrors mode="On"> 
    <error redirect="~/Error/NotFound" statusCode="404" /> 
    ... 
</customErrors>