7

Я наткнулся на странное поведение, но я не уверен, что я нахожусь на правильном пути здесь.Фильтры GlobalFilterCollection запускаются до фильтров ControllerInstanceFilterProvider

У меня есть контроллер, который переопределяет OnException метод базового класса 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") 
     ); 
    } 
} 

У меня также есть обычай 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

Смежные вопросы