解说asp.net core MVC 过滤器的执行顺序
asp.net core MVC 过滤器会在请求管道的各个阶段触发。同一阶段又可以注册多个范围的过滤器,例如Global范围,controller范围等。以ActionFilter为例,我们来看看过滤器的触发顺序。
过滤器可注册范围
- 全局:将作用于所有请求的action
- controller:将作用于这个controller下的所有action
- action:作用于单个action
定义过滤器
全局
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执行之后");
}
}
controller(分为注解方式和重写方式)
注解方式:
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执行后");
}
应用过滤器
全局(在Startup中修改)
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc(o =>
{
o.Filters.Add<GlobalActionFilter>();
});
}
controller(重写方式直接可用不用操作)
[ControllerActionFilter]
public class ValuesController : Controller
Action
[HttpGet]
[ActionActionFilter]
public IEnumerable<string> Get()
执行结果

从结果可以看出,Controller重写 > 全局 > Controller > Action
自定义过滤器执行顺序
过滤器的执行顺序不是一成不变的,aspNet Core 通过灵活的设计让我们可以手动自定义过滤器的执行顺序。要实现自定义过滤器执行顺序则需要实现IOrderedFilter接口,该接口定义一个int类型的Order属性,这个属性越大则执行顺序越滞后。
实现IOrderedFilter接口
public class GlobalActionFilter : IAsyncActionFilter,IOrderedFilter
{
public int Order => 0;
继承Attribute方式直接传入参数
[ControllerActionFilter(Order =-1)]
public class ValuesController : Controller
{
[HttpGet]
[ActionActionFilter(Order =-2)]
public IEnumerable<string> Get()
{
结果

此时的执行顺序:controller内部重写 > Action > controller > global
解说asp.net core MVC 过滤器的执行顺序的更多相关文章
- ASP.NET Core MVC 过滤器介绍
过滤器的作用是在 Action 方法执行前或执行后做一些加工处理.使用过滤器可以避免Action方法的重复代码,例如,您可以使用异常过滤器合并异常处理的代码. 过滤器如何工作? 过滤器在 MVC Ac ...
- ASP.NET Core MVC 过滤器
参考网址:https://www.cnblogs.com/dotNETCoreSG/p/aspnetcore-4_4_3-filters.html ASP.NET Core有五种类型的过滤器,每个过滤 ...
- asp.net core MVC 过滤器之ActionFilter过滤器(二)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter过滤器(一) asp.net core ...
- Asp.Net Core MVC框架内置过滤器
第一部分.MVC框架内置过滤器 下图展示了Asp.Net Core MVC框架默认实现的过滤器的执行顺序: Authorization Filters:身份验证过滤器,处在整个过滤器通道的最顶层.对应 ...
- asp.net core MVC 全局过滤器之ExceptionFilter异常过滤器(一)
本系类将会讲解asp.net core MVC中的内置全局过滤器的使用,将分为以下章节 asp.net core MVC 过滤器之ExceptionFilter异常过滤器(一) asp.net cor ...
- 在ASP.NET Core MVC中子类Controller拦截器要先于父类Controller拦截器执行
我们知道在ASP.NET Core MVC中Controller上的Filter拦截器是有执行顺序的,那么如果我们在有继承关系的两个Controller类上,声明同一种类型的Filter拦截器,那么是 ...
- asp.net core MVC 过滤器之ExceptionFilter过滤器(一)
简介 异常过滤器,顾名思义,就是当程序发生异常时所使用的过滤器.用于在系统出现未捕获异常时的处理. 实现一个自定义异常过滤器 自定义一个异常过滤器需要实现IExceptionFilter接口 publ ...
- ASP.NET Core MVC+Layui使用EF Core连接MySQL执行简单的CRUD操作
前言: 本章主要通过一个完整的示例讲解ASP.NET Core MVC+EF Core对MySQL数据库进行简单的CRUD操作,希望能够为刚入门.NET Core的小伙伴们提供一个完整的参考实例.关于 ...
- ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览
原文:Overview of ASP.NET Core MVC 作者:Steve Smith 翻译:张海龙(jiechen) 校对:高嵩 ASP.NET Core MVC 是使用模型-视图-控制器(M ...
随机推荐
- lombok的简单介绍和使用方法
这是上周在群里发现有人推荐lombok,他说是神器,当时就引起了我的好奇,然后下班回来我就看了看官网介绍(菜鸟英语水平),这就是难点了,然后就是大概了解了一下,就在网上查了查相关资料,周末的时候自己试 ...
- 前端模块化工具--webpack使用感受
话说前头 webpack前段时间有听说一下,现在已经到了3.x的版本,自己没去接触.因为之前使用gulp来作为自己的项目构建工具.现在感觉gulp使用的趋势在减少.现在这段时间去接触了webpack, ...
- 二叉树 - 建立与遍历使用Java
二叉树的遍历(traversing binary tree)是指从根节点出发,按照某种次序依次访问二叉树中所有节点,使得每个节点仅被访问一次 前序遍历:若二叉树为空,则空操作返回null.否则先访问根 ...
- [Android]Android内存泄漏你所要知道的一切(翻译)
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/7235616.html Android内存泄漏你所要知道的一切 ...
- Sping之Ioc
Ioc,控制反转,依赖注入! 作用:降低代码之间的耦合性 代码永远是最好的示例: 1.新建test类 package demo; public class test { String string_v ...
- JavaScript垃圾收集-标记清除和引用计数
JavaScript具有自动垃圾收集机制,执行环境会负责管理代码执行过程中使用的内存. 垃圾收集机制原理:垃圾收集器会按照固定的时间间隔(或代码执行中预定的收集时间), 周期性地执行这一操作:找出那些 ...
- [node] node 版本更新
一. 命令 node -v sudo npm cache clean -f // 清除缓存 sudo npm install -g n // 安装Node 模块 sudo n stable // 升级 ...
- 阿里云服务器Windows Server 2008/2012部署Office Web Server 2013
以前成功将Office Web Server 2013部署在了本地服务器上,此次是将Office Web Server 2013部署在阿里云服务器Windows Server 2008和2012上,中 ...
- nopCommerce 3.9 大波浪系列 之 开发支持多店的插件
一.基础介绍 nop支持多店及多语言,本篇结合NivoSlider插件介绍下如何开发支持多商城的小部件. 主要接口如下: ISettingService 接口:设置接口,可实现多店配置. (点击接口介 ...
- Android开发之监听器
一直都想进行安卓开发,最近上手了Android.刚开始学习一些基本控件,学习Android就如同进入一个新的世界,印象最深的是这个世界的规则. 最近学习了监听器,对于这个我的一点理解是监听键盘活动 B ...