【问题标题】:Filters of GlobalFilterCollection run before Filters of ControllerInstanceFilterProviderGlobalFilterCollection 的过滤器在 ControllerInstanceFilterProvider 的过滤器之前运行
【发布时间】:2012-04-20 00:49:14
【问题描述】:

我遇到了一个奇怪的行为,但我不确定我是否在正确的轨道上。

我有一个控制器,它覆盖了Controller 基类的OnException 方法。

public class ControllerFiltersController : Controller {

    public ActionResult Index() {

        throw new NotImplementedException();
    }

    protected override void OnException(ExceptionContext filterContext) {

        Trace.TraceInformation(
            "ControllerFiltersController Exception: " + DateTime.Now.ToString("hh:mm:ss.fff")
        );
    }
}

我还有一个自定义的 ExceptionFilter 如下:

public class HandleErrorCustom : IExceptionFilter {

    public void OnException(ExceptionContext filterContext) {

        Trace.TraceInformation(
            "HandleErrorCustom Exception Message: " + DateTime.Now.ToString("hh:mm:ss.fff")
        );
    }
}

然后,我将其注册为全局过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) {

    filters.Add(new HandleErrorCustom());
}

我希望 控制器实例过滤器 在全局过滤器之前运行,因为 ControllerInstanceFilterProvider 提供的过滤器的顺序是 Int32.MinValue 并且它们的范围是 FilterScope.First .

这里也有解释:ASP.NET MVC 3 Service Location, Part 4: Filters

但结果不一样:

iisexpress.exe 信息:0:HandleErrorCustom 异常消息: 06:56:49.972

iisexpress.exe 信息:0:ControllerFiltersController 异常: 06:56:49.974

这是一个 ASP.NET MVC 4 应用程序,我不知道有任何更改会影响 ASP.NET MVC 3 的过滤器排序行为。我在这里缺少什么?

【问题讨论】:

    标签: asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-filters


    【解决方案1】:

    这是预期的行为。

    过滤器排序取决于信息流动的方向。如果信息流入到动作中,那么顺序就是你所期望的;如果信息从动作中流出,则顺序颠倒。

    例如,假设您按以下顺序设置了三个过滤器:F1、F2、F3。假设这些是动作过滤器(意思是,它们正在监听 ActionExecuting 和 ActionExecuted)。系统运行它们的顺序如下:

    F1.ActionExecuting()
    F2.ActionExecuting()
    F3.ActionExecuting()
    Action()
    F3.ActionExecuted()
    F2.ActionExecuted()
    F1.ActionExecuted()
    

    根据定义,错误处理程序是在操作的返回端运行的过滤器,因此它们的顺序是相反的。

    【讨论】:

    • 现在,我明白了。因此,具有较低值并在操作的返回端运行的过滤器将首先运行。谢谢!
    猜你喜欢
    • 2013-05-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-05
    • 2019-05-09
    • 1970-01-01
    • 2012-03-25
    • 2012-07-14
    • 1970-01-01
    相关资源
    最近更新 更多