MVC 3中类似BeginRequest的过滤器?

Dan*_*zzi 14 action-filter global-asax asp.net-mvc-3

我的应用程序中有一些代码,我需要在执行任何其他任务之前执行(甚至在身份验证之前).到目前为止,我一直Application_BeginRequest在我的Global.asax中使用该事件,这一切都运行良好.但是这段代码需要访问数据库,而从Global.asax执行此操作由于某种原因感觉不对.此外,我正在使用的Ninject.MVC3 nuget不会将依赖项注入我的HttpApplication ctor.

所以我决定将此代码移动到自己的全局动作过滤器中.我现在遇到的问题是无论我使用什么Order或FilterScope给出这个过滤器,我都不能先让它执行; 我的授权过滤器总是胜过它.MSDN似乎证实了这一点:

过滤顺序

过滤器按以下顺序运行:

  1. 授权过滤器
  2. 动作过滤器
  3. 响应过滤器
  4. 异常过滤器

例如,授权过滤器首先运行,异常过滤器最后运行.在每个过滤器类型中,Order值指定运行顺序.在每个过滤器类型和顺序中,Scope枚举值指定过滤器的顺序.

我知道我可以使用HttpModule,但是感觉不是非常MVCish,所以我试图在走这条路线之前耗尽所有可能性,这导致了我的问题:

是否有一个BeginRequest等效的全局动作过滤器?

Dar*_*rov 16

您可以在基本控制器的Initialize方法中执行此操作.

另一种可能性是注册全局过滤器:

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

而在RegisterGlobalFilters你的事件Global.asax:

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    filters.Add(new HandleErrorAttribute());
    filters.Add(new MyGlobalFilter());
}
Run Code Online (Sandbox Code Playgroud)