tug*_*erk 7 asp.net-mvc asp.net-mvc-3 asp.net-mvc-4 asp.net-mvc-filters
我遇到了一个奇怪的行为,但我不确定我是否在这里正确的轨道.
我有一个控制器覆盖基类的OnException方法Controller.
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")
);
}
}
Run Code Online (Sandbox Code Playgroud)
我还有一个自定义的ExceptionFilter,如下所示:
public class HandleErrorCustom : IExceptionFilter {
public void OnException(ExceptionContext filterContext) {
Trace.TraceInformation(
"HandleErrorCustom Exception Message: " + DateTime.Now.ToString("hh:mm:ss.fff")
);
}
}
Run Code Online (Sandbox Code Playgroud)
然后,我将其注册为全局过滤器:
public static void RegisterGlobalFilters(GlobalFilterCollection filters) {
filters.Add(new HandleErrorCustom());
}
Run Code Online (Sandbox Code Playgroud)
我的预期是这里的控制器实例过滤器,因为它们提供的过滤器的顺序全球过滤器之前运行ControllerInstanceFilterProvider是Int32.MinValue和它们的范围FilterScope.First.
正如此处所解释的:ASP.NET MVC 3服务位置,第4部分:过滤器
但结果却不同:
iisexpress.exe信息:0:HandleErrorCustom异常消息:06:56:49.972
iisexpress.exe信息:0:ControllerFiltersController例外:06:56:49.974
这是一个ASP.NET MVC 4应用程序,我不知道任何影响ASP.NET MVC 3的过滤器排序行为的更改.我在这里缺少什么?
Bra*_*son 13
这是预期的行为.
过滤器排序取决于信息流动的方向.如果信息流入动作,那么订单就像您期望的那样; 如果信息从流程中流回,则顺序颠倒.
例如,假设您按此顺序有三个过滤器:F1,F2,F3.假设这些是动作过滤器(意思是,它们正在侦听ActionExecuting和ActionExecuted).系统将运行它们的顺序如下:
F1.ActionExecuting()
F2.ActionExecuting()
F3.ActionExecuting()
Action()
F3.ActionExecuted()
F2.ActionExecuted()
F1.ActionExecuted()
Run Code Online (Sandbox Code Playgroud)
根据定义,错误处理程序是在操作的返回端运行的过滤器,因此它们的顺序是相反的.
| 归档时间: |
|
| 查看次数: |
4545 次 |
| 最近记录: |