asp.net core MVC 过滤器会在请求管道的各个阶段触发。同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等。以ActionFilter为例,我们来看看过滤器的触发顺序。
- public class GlobalActionFilter : IAsyncActionFilter
- {
- public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate
- next)
- {
- var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
- var logger = factory.CreateLogger<GlobalActionFilter>();
- logger.LogWarning("全局ActionFilter执行之前");
- await next();
- logger.LogWarning("全局ActionFilter执行之后");
- }
- }
注解方式:
- public class ControllerActionFilter : ActionFilterAttribute
- {
- public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
- {
- var factory = context.HttpContext.RequestServices.GetService<ILoggerFactory>();
- var logger = factory.CreateLogger<GlobalActionFilter>();
- logger.LogWarning("ControllerActionFilter执行之前");
- await next();
- logger.LogWarning("ControllerActionFilter执行之后");
- }
- }
重写方式(在controller内重写OnActionExecutionAsync)
- public override async Task OnActionExecutionAsync(ActionExecutingContext context,
- ActionExecutionDelegate next)
- {
- var logger = _factory.CreateLogger<ValuesController>();
- logger.LogWarning("Controller内部重写的actionFinter执行前");
- await next();
- logger.LogWarning("Controller内部重写的actionFinter执行后");
- }
- public void ConfigureServices(IServiceCollection services)
- {
- services.AddMvc(o =>
- {
- o.Filters.Add<GlobalActionFilter>();
- });
- }
- [ControllerActionFilter]
- public class ValuesController : Controller
- [HttpGet]
- [ActionActionFilter]
- public IEnumerable<string> Get()
从结果可以看出,Controller重写 > 全局 > Controller > Action
过滤器的执行顺序不是一成不变的,aspNet Core 通过灵活的设计让我们可以手动自定义过滤器的执行顺序。要实现自定义过滤器执行顺序则需要实现IOrderedFilter接口,该接口定义一个int类型的Order属性,这个属性越大则执行顺序越滞后。
- public class GlobalActionFilter: IAsyncActionFilter,
- IOrderedFilter {
- public int Order = >0;
- [ControllerActionFilter(Order =-1)]
- public class ValuesController : Controller
- {
- [HttpGet]
- [ActionActionFilter(Order =-2)]
- public IEnumerable<string> Get()
- {
此时的执行顺序:controller内部重写 > Action > controller > global
来源: http://www.cnblogs.com/huanent/p/7452066.html