.net 温故知新【16】:Asp.Net Core WebAPI 筛选器
一、筛选器
通过使用筛选器可在请求处理管道中的特定阶段之前或之后运行代码。
这即是我们经常听到的面向切面编程AOP(Aspect Oriented Programming)技术,AOP通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术。
筛选器在 ASP.NET Core 操作调用管道(有时称为筛选器管道)内运行。 筛选器管道在 ASP.NET Core 选择了要执行的操作之后运行:
Asp.Net Core 关注的切面点 包括错误处理、缓存、配置、授权和日志记录筛选器,这个是说通过筛选器可以实现对以上关注点的一些操作。
在Asp.Net Core中有如下几种类型的筛选器:

其中部分是内置筛选器,比如授权,响应缓存已经帮我们内置进了框架,我们只需要配置即可使用;其他筛选器是可以自定义处理逻辑的。
下图展示了筛选器类型在筛选器管道中的交互方式和执行顺序:

二、操作型筛选器
第一部分主要是对筛选器的一个梳理,有些重点的提炼,详情查看文档,因为文档部分理解起来比较晦涩,比如关注点是关注点,知识说筛选器可以对这些关注点启到作用,筛选器是固定的几种,不要被文档中的这种描述搞晕了,一会儿有这几种,怎么到下面又是另外几种,要注意区分重点。
操作筛选器可以实现接口IActionFilter,在接口中有两个方法,OnActionExecuting 在调用操作方法之前执行。 OnActionExecuted 在操作方法返回之后执行。
- 先建WebAPI项目 WebAPI_Filter
- 建一个 FilterController,并创建Get请求Test
namespace WebAPI_Filter.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class FilterController : ControllerBase
{
[HttpGet]
public string Test()
{
return "测试Filter!";
}
}
}
- 创建ActionFilter 筛选器
namespace WebAPI_Filter.Filter
{
public class MyActionFilter : IActionFilter
{
public void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl()+ " 执行之后!");
}
public void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl() + " 执行之前!");
}
}
}
- 在Program.cs里面添加筛选器

执行测试接口

三、筛选器作用域和执行顺序
上面直接在Program.cs里面添加筛选器的方式称为全局筛选器,所有控制器、操作都会受全局筛选器影响。还有一种筛选器实现方式是属性筛选器,通过继承属性类然后将属性标签放置在控制器或者操作上。
新建两个属性类MyAttributeFilter 用于Controller控制器类,MyOPAttributeFilter用于操作方法上。
public class MyAttributeFilter: ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl() + " 控制器之后-筛选器属性!");
}
public override void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl() + " 控制器之前-筛选器属性!");
}
}
public class MyOPAttributeFilter : ActionFilterAttribute
{
public override void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl() + " 操作之后-筛选器属性!");
}
public override void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl() + " 操作之前-筛选器属性!");
}
}

加上之前的全局筛选器,我们一共有三个作用域的筛选器,现在我们测试看看筛选器的执行顺序。

则可总结出不同作用域筛选器的执行顺序:
全局筛选器的 before 代码。
控制器筛选器的 before 代码。
操作方法筛选器的 before 代码。
操作方法筛选器的 after 代码。
控制器筛选器的 after 代码。
全局筛选器的 after 代码。
当然可以通过 Order 属性来确定执行顺序,在全局或者属性筛选器里面设置 Order 值,值越小执行优先级越高。

四、筛选器依赖注入
可按类型或实例添加筛选器。 如果添加实例,该实例将用于每个请求。
其中builder.Services.AddControllers(options => options.Filters.Add<MyActionFilter>())即为按实例添加,该MyActionFilter用于每个请求。
如果添加类型,则将激活该类型。 激活类型的筛选器意味着:第一种是为每个请求创建一个实例,第二种依赖关系注入 (DI) 将填充所有构造函数依赖项。
上面位置我们是为每个请求创建一个实例,这样的话无法使用依赖注入体系为我们自动注入,因为因为属性在应用时必须提供自己的构造函数参数,该参数需要手动指定。
比如我们想在操作方法的MyOPAttributeFilter筛选属性 注入IHostEnvironment:
public class MyOPAttributeFilter : ActionFilterAttribute
{
IHostEnvironment hostEnvironment;
public MyOPAttributeFilter(IHostEnvironment _hostEnvironment)
{
hostEnvironment = _hostEnvironment;
}
public override void OnActionExecuted(ActionExecutedContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl() + " 操作之后-筛选器属性!");
}
public override void OnActionExecuting(ActionExecutingContext context)
{
Console.WriteLine(context.HttpContext.Request.GetDisplayUrl() + " 操作之前-筛选器属性!");
//打印环境变量
Console.WriteLine(hostEnvironment.EnvironmentName);
}
}
这个时候直接就报错提示需要参数,而我们想的是通过依赖注入配置。

框架提供以下筛选器支持从 DI 提供的构造函数依赖项:
- ServiceFilterAttribute
- TypeFilterAttribute
- 在属性上实现 IFilterFactory。
TypeFilterAttribute:不会直接从 DI 容器解析其类型。Microsoft.Extensions.DependencyInjection.ObjectFactory 对类型进行实例化,所以不需要先将MyOPAttributeFilter加入容器,直接使用:
[TypeFilter(typeof(MyOPAttributeFilter))]

ServiceFilterAttribute 使用需要先将MyOPAttributeFilter注入到容器,然后再使用。

以上就是关于AOP切面编程和筛选器的梳理,其他类型的筛选器和细节可查询官方文档:ASP.NET Core 中的筛选器
.net 温故知新【16】:Asp.Net Core WebAPI 筛选器的更多相关文章
- Asp.Net Core WebApi学习笔记(四)-- Middleware
Asp.Net Core WebApi学习笔记(四)-- Middleware 本文记录了Asp.Net管道模型和Asp.Net Core的Middleware模型的对比,并在上一篇的基础上增加Mid ...
- Asp.net core WebApi 使用Swagger生成帮助页实例
最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...
- 零基础ASP.NET Core WebAPI团队协作开发
零基础ASP.NET Core WebAPI团队协作开发 相信大家对“前后端分离”和“微服务”这两个词应该是耳熟能详了.网上也有很多介绍这方面的文章,写的都很好.我这里提这个是因为接下来我要分享的内容 ...
- 记一次使用Asp.Net Core WebApi 5.0+Dapper+Mysql+Redis+Docker的开发过程
#前言 我可能有三年没怎么碰C#了,目前的工作是在全职搞前端,最近有时间抽空看了一下Asp.net Core,Core版本号都到了5.0了,也越来越好用了,下面将记录一下这几天以来使用Asp.Net ...
- asp.net core webapi之跨域(Cors)访问
这里说的跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同域的框架中(iframe)的数据.只要协议.域名.端口有任何一个不同,都被当作 ...
- ASP.NET Core WebAPI 开发-新建WebAPI项目
ASP.NET Core WebAPI 开发-新建WebAPI项目, ASP.NET Core 1.0 RC2 即将发布,我们现在来学习一下 ASP.NET Core WebAPI开发. 网上已经有泄 ...
- Asp.net Core WebApi 使用Swagger做帮助文档,并且自定义Swagger的UI
WebApi写好之后,在线帮助文档以及能够在线调试的工具是专业化的表现,而Swagger毫无疑问是做Docs的最佳工具,自动生成每个Controller的接口说明,自动将参数解析成json,并且能够在 ...
- Asp.net core WebApi 使用Swagger生成帮助页
最近我们团队一直进行.net core的转型,web开发向着前后端分离的技术架构演进,我们后台主要是采用了asp.net core webapi来进行开发,开始每次调试以及与前端人员的沟通上都存在这效 ...
- ASP.Net Core WebApi几种版本控制对比
版本控制的好处: (1)助于及时推出功能, 而不会破坏现有系统. (2)它还可以帮助为选定的客户提供额外的功能. API 版本控制可以采用不同的方式进行控制,方法如下: (1)在 URL 中追加版本或 ...
- ASP.NET Core WebApi 返回统一格式参数(Json 中 Null 替换为空字符串)
相关博文:ASP.NET Core WebApi 返回统一格式参数 业务场景: 统一返回格式参数中,如果包含 Null 值,调用方会不太好处理,需要替换为空字符串,示例: { "respon ...
随机推荐
- 《SQL与数据库基础》04. SQL-DQL
目录 DQL 基础查询 条件查询 分组聚合 聚合函数 分组查询 结果排序 分页限制 总结 本文以 MySQL 为例 DQL 语法结构: SELECT 字段列表 FROM 表名列表 WHERE 条件列表 ...
- LeetCode952三部曲之二:小幅度优化(137ms -> 122ms,超39% -> 超51%)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 本文是<LeetCode952三部曲& ...
- Vue-入门vue,及第一个vue程序
一.初始Vue 什么是vue Vue (发音为 /vjuː/,类似 view) 是一款用于构建用户界面的 JavaScript 框架.它基于标准 HTML.CSS 和 JavaScript 构建,并提 ...
- Solution Set -「ARC 113」
「ARC 113A」A*B*C Link. 就是算 \(\sum_{i=1}^{k}\sum_{j=1}^{\lfloor\frac{k}{i}\rfloor}\lfloor\frac{k}{j\ti ...
- centos7.6 安装Jenkins
一.安装java环境 yum install -y java-11-openjdk* 三.将Jenkins存储库添加到yum repos wget -O /etc/yum.repos.d/jenkin ...
- 基于TOTP算法的Github两步验证2FA(双因子)机制Python3.10实现
从今年(2023)三月份开始,Github开始强制用户开启两步验证2FA(双因子)登录验证,毫无疑问,是出于安全层面的考虑,毕竟Github账号一旦被盗,所有代码仓库都会毁于一旦,关于双因子登录的必要 ...
- 服务链路追踪 —— SpringCloud Sleuth
Sleuth 简介 随着业务的发展,系统规模变得越来越大,微服务拆分越来越细,各微服务间的调用关系也越来越复杂.客户端请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果,几平每一个请求 ...
- 再谈http请求调用(Post与Get),项目研发的核心一环
支持.Net Core(2.0及以上)与.Net Framework(4.0及以上) [目录] 前言 Post请求 Get请求 与其它工具的比较 1[前言] http请求调用是开发中经常会用到的功能. ...
- 环境搭建:在VSCode搭建Python环境
1.安装vscode 2.下载python解释器 安装python https://www.python.org/downloads/windows/ 下载可执行的安装文件: 安装完成 ...
- 深入理解 Python 虚拟机:协程初探——不过是生成器而已
深入理解 Python 虚拟机:协程初探--不过是生成器而已 在 Python 3.4 Python 引入了一个非常有用的特性--协程,在后续的 Python 版本当中不断的进行优化和改进,引入了新的 ...
