Фильтр 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());
}