我有一个控制器,它覆盖了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 information: 0 : HandleErrorCustom Exception Message:
06:56:49.972iisexpress.exe information: 0 : ControllerFiltersController Exception:
06:56:49.974
这是一个ASP.NET MVC 4应用程序,我不知道任何影响ASP.NET MVC 3的过滤器排序行为的更改.我在这里缺少什么?
解决方法
过滤器排序取决于信息流动的方向.如果信息流入动作,那么订单就像您期望的那样;如果信息流回动作,那么订单将被撤销.
例如,假设您按此顺序有三个过滤器:F1,F2,F3.假设这些是动作过滤器(意思是,它们正在侦听ActionExecuting和ActionExecuted).系统将运行它们的顺序如下:
F1.ActionExecuting() F2.ActionExecuting() F3.ActionExecuting() Action() F3.ActionExecuted() F2.ActionExecuted() F1.ActionExecuted()
根据定义,错误处理程序是在操作的返回端运行的过滤器,因此它们的顺序是相反的.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。