7

Natknąłem się na dziwne zachowanie, ale nie jestem pewien, czy jestem na dobrej drodze.Filtry GlobalFilterCollection run before Filters of ControllerInstanceFilterProvider

Mam kontroler, który zastępuje metodę OnException z klasy bazowej Controller.

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") 
     ); 
    } 
} 

Mam też zwyczaj ExceptionFilter następująco:

public class HandleErrorCustom : IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 

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

Potem zarejestrował go jako filtr globalnej:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

    filters.Add(new HandleErrorCustom()); 
} 

Czego oczekuje się tu na przykład kontrolera filtr do uruchomienia przed filtrem globalnym, ponieważ kolejność filtrów dostarczonych przez ControllerInstanceFilterProvider to Int32.MinValue it jego zakres to FilterScope.First.

Jak wyjaśniono również tutaj: ASP.NET MVC 3 Service Location, Part 4: Filters

Ale wynik jest inny:

iisexpress.exe Informacja: 0: HandleErrorCustom Wyjątek Wiadomość: 06: 56: 49,972

iisexpress.exe Informacja: 0: ControllerFiltersController Wyjątek: 06:56: 49.974

To jest aplikacja ASP.NET MVC 4 i nie jestem świadomy żadnych zmian, które wpływają na zachowanie kolejności filtrowania ASP.NET MVC 3. Czego tu mi brakuje?

Odpowiedz

12

Jest to oczekiwane zachowanie.

Kolejność filtrowania zależy od kierunku przepływu informacji. Jeśli informacja wpływa do akcji, kolejność jest zgodna z oczekiwaniami; jeśli informacje są wycofywane z działania, kolejność jest odwrotna.

Załóżmy na przykład, że masz trzy filtry w tej kolejności: F1, F2, F3. Załóżmy, że są to filtry akcji (co oznacza, że ​​słuchają ActionExecuting i ActionExecuted). Kolejność system ich uruchomienia jest następujący:

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

obsługi błędów są z definicji, filtry, które działają na powrocie po stronie działań, więc ich kolejność jest odwrotna.

+0

Teraz, mam to. Dlatego filtry, które mają niższą wartość i działają po stronie zwrotnej, będą uruchamiane jako pierwsze. Dzięki! – tugberk