解说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 ...
随机推荐
- shell脚本交互:expect学习笔记及实例详解
最近项目需求,需要写一些shell脚本交互,管道不够用时,expect可以很好的实现脚本之间交互,搜索资料,发现网上好多文章都是转载的,觉得这篇文章还不错,所以简单修改之后拿过来和大家分享一下~ 1. ...
- SpringMVC原理及非注解配置详解
1. Spring介绍 Spring MVC是Spring提供的一个强大而灵活的web框架.借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单. 这些控制器 ...
- poj_2186: Popular Cows(tarjan基础题)
题目链接 tarjan参考博客 本文代码参考博客 题意:求在图上可以被所有点到达的点的数量. 首先通过tarjan缩点,将所有内部两两可达的子图缩为一点,新图即为一个有向无环图(即DAG). 在这个D ...
- xdu_1064:Desolator in RA2
问题转化为,单个面积*2-交面积.下面求交面积.把直角坐标系中全部转90°,每个方块的坐标都做相应变化,这样会发现新的坐标系中空出了一部分方块,找规律发现,若求交矩形包含的方框数,其中恰好一半是前面空 ...
- Spring初学
一.spring体系结构spring核心组件 1.Beans(包装应用程序自定义对象Object,Object中存有数据) 2.Core (资源加载,资源抽象,建立维护与bean之间的一些关系所需的一 ...
- tensorflow 实现神经网络
import tensorflow as tf import numpy as np # 添加层 def add_layer(inputs, in_size, out_size, activation ...
- JavaScript系统学习小结——Object类型、Array类型
今天学习JavaSript中引用变量中的Object类型和Array类型: 1. Js中大多数引用类型值都是Object类型的实例,Object类型在应用程序中存储和传输数据时,是非常理想的选择: 创 ...
- Hadoop常用命令集合
查看安全模式 bin/hadoop dfsadmin -safemode enter | leave | get | wait
- Linux学习笔记--一些错误的记录
运行linux的时候,输入shutdown -r now命令提示:bash:shutdown is not found.出现这个错误是因为这条命令没有加入到系统的配置文件中,运行命令export PA ...
- FPGA计算3行同列数据之和
实验:FPGA计算3行同列数据之和 实验要求:PC机通过串口发送3行数据(一行有56个数据,3行共有56*3=168个数据)给FPGA,FPGA计算3行同一列数据的和,并将结果通过串口返回给上位机. ...