Фильтр BeginRequest в MVC 3?

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

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

Заказ фильтра

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

  • Фильтры авторизации
  • Фильтры действий
  • Фильтры ответов
  • Фильтры исключений

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

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

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

Ответы

Ответ 1

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

Другая возможность - зарегистрировать глобальный фильтр :

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

и в событии RegisterGlobalFilters вашего Global.asax:

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