BeginRequest как фильтр в MVC 3? - PullRequest
14 голосов
/ 02 февраля 2011

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

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

Фильтр заказа

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

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

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

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

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

1 Ответ

16 голосов
/ 02 февраля 2011

Вы можете сделать это в методе 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());
}
...