BeginRequest-подобный фильтр в MVC 3?


У меня есть некоторый код в моем приложении, который я должен выполнить на каждом запросе, прежде, чем что-либо другое выполнит (даже до аутентификации). До сих пор я использовал событие Application_BeginRequest в моем глобальном.асакс, и это сработало отлично. Но этот код должен попасть в базу данных, и делать это из Global.асакс почему-то не чувствует себя хорошо. Кроме того, Нинект.NuGet для MVC3 я использую не впрыснуть зависимостей в конструктор моего класса HttpApplication.

Итак, я решил переместить этот код. в свой собственный глобальный фильтр действий. Проблема, с которой я сейчас сталкиваюсь, заключается в том, что независимо от того, какой порядок или FilterScope я даю этому фильтру, я не могу заставить его выполнить первым; мой фильтр авторизации всегда бьет его. MSDN , похоже, подтверждает это:

Порядок Фильтрации

Фильтры выполняются в следующем порядке:

  1. фильтры авторизации
  2. фильтры действия
  3. фильтры ответов
  4. фильтры исключений

Для например, запускаются фильтры авторизации первый и фильтров исключений в прошлом. В пределах каждого типа фильтра порядок значение указывает порядок выполнения. Внутри каждый тип фильтра и порядок, область применения значение перечисления определяет порядок для фильтров.

Я знаю, что могу использовать HttpModule, но это не очень MVCish , поэтому я пытаюсь исчерпать все возможности, прежде чем идти по этому маршруту, что приводит к моему вопросу:

Существует ли эквивалент BeginRequest для глобальные фильтры действий?

1 14

1 ответ:

Это можно сделать в методе Initialize базового контроллера.

Еще одна возможность-зарегистрировать глобальный фильтр :

public class MyGlobalFilter : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        // that's gonna be hit
    }
}

И в RegisterGlobalFilters случае вашего Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new MyGlobalFilter());
}