7

我遇到了一個奇怪的行爲,但我不確定自己是否在正確的軌道上。GlobalFilterCollection的過濾器在ControllerInstanceFilterProvider的過濾器之前運行

我有一個控制器,它會覆蓋Controller基類的OnException方法。

public class ControllerFiltersController : Controller { 

    public ActionResult Index() { 

     throw new NotImplementedException(); 
    } 

    protected override void OnException(ExceptionContext filterContext) { 

     Trace.TraceInformation(
      "ControllerFiltersController Exception: " + DateTime.Now.ToString("hh:mm:ss.fff") 
     ); 
    } 
} 

我也有一個自定義的ExceptionFilter如下:

public class HandleErrorCustom : IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 

     Trace.TraceInformation(
      "HandleErrorCustom Exception Message: " + DateTime.Now.ToString("hh:mm:ss.fff") 
     ); 
    } 
} 

然後,我把它註冊爲一個全球性的過濾器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

    filters.Add(new HandleErrorCustom()); 
} 

我期待什麼是這裏的控制器實例過濾器在全局過濾器之前運行,因爲由ControllerInstanceFilterProvider提供的過濾器的順序是Int32.MinValue和t他的範圍是FilterScope.First

還如這裏解釋:ASP.NET MVC 3 Service Location, Part 4: Filters

但結果是不同的:

iisexpress.exe信息:0:HandleErrorCustom異常消息: 06:56:49.972

iisexpress.exe信息:0:ControllerFiltersController例外: 06:56:49.974

這是一個ASP.NET MVC 4應用程序,我不知道任何會影響ASP.NET MVC 3的過濾器排序行爲的更改。我在這裏丟失了什麼?

回答

12

這是預期的行爲。

過濾器排序取決於信息流動的方向。如果信息流入行動,那麼訂單就如您所期望的那樣;如果信息流出行動,則順序顛倒。

例如,假設您按此順序有三個過濾器:F1,F2,F3。假設這些是動作過濾器(意思是說,他們正在偵聽ActionExecuting和ActionExecuted)。該系統將運行它們的順序如下:

F1.ActionExecuting() 
F2.ActionExecuting() 
F3.ActionExecuting() 
Action() 
F3.ActionExecuted() 
F2.ActionExecuted() 
F1.ActionExecuted() 

錯誤處理程序,顧名思義,即在行動返回側運行的過濾器,所以他們的順序是相反的。

+0

現在,我明白了。因此,具有較低值並在動作返回端運行的過濾器將首先運行。謝謝! – tugberk 2012-04-19 17:18:14