2017-05-22 21 views
7

我有一個自定義異常FilterAttribute如下列:什麼時候將執行MVC ExceptionFilter與應用程序級錯誤處理程序?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true)] 
public sealed class ExceptionLoggingFilterAttribute : FilterAttribute, IExceptionFilter 
{ 
    public void OnException(ExceptionContext filterContext) 
    { 
     if (filterContext == null) 
     { 
      throw new ArgumentNullException(nameof(filterContext)); 
     } 

     if (filterContext.ExceptionHandled) 
     { 
      return; 
     } 

     // some exception logging code (not shown) 

     filterContext.ExceptionHandled = true; 
} 

我有這個全局註冊在我的FilterConfig.cs

public static class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters?.Add(new ExceptionLoggingFilterAttribute()); 
    } 
} 

我也有我的Global.asax中聲明的Application_Error事件。 CS

protected void Application_Error(object sender, EventArgs e) 
    { 
     var exception = Server.GetLastError(); 

     // some exception logging code (not shown) 
    } 
  1. 時候會異常過濾器代碼被擊中時WIL l它會直接轉到Application_Error方法中的全局錯誤處理程序? (我理解ExceptionHandled概念,並認識到通過將其標記爲在我的過濾器中處理,它將不會級聯到全局錯誤處理程序)。

我認爲會觸發過濾器的一個異常 - 404的HttpException不會觸發過濾器,但會在應用程序錯誤處理程序中被捕獲。

  1. 我已經看到一些代碼示例,其中人們使用global.asax.cs中的HttpContext.Current對特定的錯誤視圖執行Server.TransferRequest。這是最佳做法嗎?使用web.config的system.web部分中的CustomErrors部分會更好嗎?

回答

0

只有在ASP.NET MVC管道執行期間發生的錯誤(例如,在執行Action操作的過程中:

異常過濾器。如果 在執行 ASP.NET MVC管道期間拋出了未處理的異常,則這些實現IExceptionFilter並執行。異常過濾器可用於任務,如 日誌記錄或顯示錯誤頁面。 HandleErrorAttribute類是 例外過濾器的一個例子。

(來自:https://msdn.microsoft.com/en-us/library/gg416513(VS.98).aspx

在404錯誤的情況下,操作方法不能確定,因此,誤差不會在過濾器處理。

所有其他錯誤將在Application_Error方法中處理。

至於你的問題的第二部分,我建議,其中包含有關如何設置自定義錯誤頁以可靠的方式很好地概括了以下博客文章: http://benfoster.io/blog/aspnet-mvc-custom-error-pages

相關問題