7

Me encontré con un comportamiento extraño, pero no estoy seguro de si estoy en el camino correcto aquí.Filtros de GlobalFilterCollection ejecutados antes de los filtros de ControllerInstanceFilterProvider

Tengo un controlador que anula el método OnException de la clase base 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") 
     ); 
    } 
} 

Tengo también una costumbre ExceptionFilter de la siguiente manera:

public class HandleErrorCustom : IExceptionFilter { 

    public void OnException(ExceptionContext filterContext) { 

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

Entonces, registrada como un filtro global:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) { 

    filters.Add(new HandleErrorCustom()); 
} 

Lo que esperaba es que aquí para la instancia controlador filtrar para ejecutar antes del filtro global ya que el orden de los filtros proporcionados por ControllerInstanceFilterProvider es Int32.MinValue yt El alcance de ellos es FilterScope.First.

Como también se explica aquí: ASP.NET MVC 3 Service Location, Part 4: Filters

Pero el resultado es diferente:

información iisexpress.exe: 0: HandleErrorCustom Mensaje de excepción: 06: 56: 49.972

iisexpress.exe Información: 0: ControllerFiltersController Exception: 06: 56: 49.974

Esta es una aplicación ASP.NET MVC 4 y no conozco ningún cambio que afecte el comportamiento de ordenamiento del filtro de ASP.NET MVC 3. ¿Qué me falta aquí?

Respuesta

12

Se espera que esto suceda.

El orden de los filtros depende de la dirección en que fluya la información. Si la información fluye hacia la acción, entonces el orden es el esperado; si la información fluye fuera de la acción, el orden se invierte.

Por ejemplo, suponga que tiene tres filtros en este orden: F1, F2, F3. Supongamos que estos son filtros de acción (es decir, están escuchando ActionExecuting y ActionExecuted). El fin del sistema funcionará de ellos es el siguiente:

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

controladores de errores son, por definición, los filtros que se ejecutan en el lado de retorno de las acciones, por lo que su orden se invierte.

+0

Ahora, lo tengo. Entonces, los filtros, que tienen el valor más bajo y se ejecutan en el lado de retorno de las acciones, se ejecutarán primero. ¡Gracias! – tugberk