2013-06-19 39 views
1

我們有一個配置爲使用ELMAH的ASP.NET MVC 3應用程序。我們在我們的Application_Error方法中也有這樣的代碼。 ELMAH和我們的自定義代碼都登錄到數據庫。同時使用ELMAH和Application_Error

protected void Application_Error(object sender, EventArgs e) 
{ 
    MvcApplication app = (MvcApplication)sender; 
    HttpContext httpContext = app.Context; 

    Exception ex = app.Server.GetLastError(); 
    HttpException httpException = ex as HttpException;    

    //log the error with our custom logging 

    Server.ClearError(); 

    if (httpContext.IsCustomErrorEnabled) //only show custom error if enabled in config 
    { 
     httpContext.Response.Clear(); 
     httpContext.ClearError(); 

     //show our own custom error page here 

    } 
} 

的問題(不是一個真正的問題,但無論),我們看到的是,ELMAH,我們的自定義代碼都記錄異常的DB。我期望調用Server.ClearError()和httpContext.ClearError將處理該錯誤,它永遠不會去ELMAH。但是,錯誤是否被記錄了兩次意味着ELMAH和application_error基本上並行運行,並且它們都同時收到未處理的異常?無論如何,要告訴ELMAH忽略這個錯誤?

我們的意圖是隻有ELMAH處理錯誤,如果真的發生了錯誤,就像在elmah註冊後的ASP.NET管道中,但在MVC應用程序運行之前一樣。

回答

4

問題是它首先記錄到ELMAH。所以是的,你可以告訴它不要使用e.Dismiss()登錄到ELMAH:ErrorLog_Filtering函數在Application_Error之前命中。因此,添加此功能以及您需要的任何所需邏輯,以確定您是否需要使用ELMAH。

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    //get the exceptions like: 
    Exception m = e.Exception; 
    Exception ex = e.Exception.GetBaseException(); 

    //tell it not to log the error in ELMAH like (based on whatever criteria you have): 
    e.Dismiss(); 

    //Application_Error will be hit next 
} 

protected void Application_Error(object sender, EventArgs e) 
{ 
    //your logic 
} 
+0

完美,謝謝! –