如何在 ASP.NET Core Web API 方法执行前后 “偷偷“ 作一些 “坏“ 事?初识 ActionFilterAttribute

news/2024/9/19 22:54:56/文章来源:https://www.cnblogs.com/JackyGz/p/18421535

image

前言:什么是 ActionFilterAttribute?

ActionFilterAttribute 是一种作用于控制器 Action 方法的特性(Attribute),通过它,你可以在操作执行前后、异常处理时等不同的阶段插入自定义逻辑。

比如在执行操作方法之前修改请求参数、记录日志、进行权限验证等操作,在执行操作方法之后发送邮件、同步数据等等。

本文主要通过一些例子来说明什么是 ActionFilterAttribute 及如何应用。

Step By Step 步骤:

  1. 创建一个 asp.net core webapi 的项目

  2. 直接继承 ActionFilterAttribute 抽象类创建自定义的 Test1ActionFilterAttribute 类并注入 ILogger

    using Microsoft.AspNetCore.Mvc.Filters;namespace AttributeSample
    {[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]public class Test1ActionFilterAttribute: ActionFilterAttribute{private ILogger<Test1ActionFilterAttribute> _logger;// 在构造方法里注入 ILogger public Test1ActionFilterAttribute(ILogger<Test1ActionFilterAttribute> logger){_logger = logger;}/// <summary>/// 在控制器执行之前调用/// </summary>/// <param name="context"></param>public override void OnActionExecuting(ActionExecutingContext context){_logger.LogInformation("在控制器执行之前调用...");base.OnActionExecuting(context);}/// <summary>/// 在控制器执行之后调用/// </summary>/// <param name="context"></param>public override void OnActionExecuted(ActionExecutedContext context){_logger.LogInformation("在控制器执行之后调用...");base.OnActionExecuted(context);}}
    }
    
  3. 通过实现 IActionFilter 接口创建自定义的 Test2ActionFilterAttribute 类并注入 ILogger(推荐方式)

    using Microsoft.AspNetCore.Mvc.Filters;namespace AttributeSample
    {[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]public class Test2ActionFilterAttribute: Attribute, IActionFilter{private ILogger<Test2ActionFilterAttribute> _logger;// 在构造方法里注入 ILogger public Test2ActionFilterAttribute(ILogger<Test2ActionFilterAttribute> logger){_logger = logger;}/// <summary>/// 在控制器执行之前调用/// </summary>/// <param name="context"></param>public void OnActionExecuting(ActionExecutingContext context){_logger.LogInformation("在控制器执行之前调用...");}/// <summary>/// 在控制器执行之后调用/// </summary>/// <param name="context"></param>public void OnActionExecuted(ActionExecutedContext context){_logger.LogInformation("在控制器执行之后调用...");}}
    }
    
  4. 直接继承 ActionFilterAttribute 抽象类创建自定义的 Test3ActionFilterAttribute 类,不注入其他依赖

    using Microsoft.AspNetCore.Mvc.Filters;namespace AttributeSample
    {[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false)]public class Test3ActionFilterAttribute: Attribute, IActionFilter{private string _myName;public Test3ActionFilterAttribute(string myName){_myName = myName;}/// <summary>/// 在控制器执行之前调用/// </summary>/// <param name="context"></param>public void OnActionExecuting(ActionExecutingContext context){_myName += " before";}/// <summary>/// 在控制器执行之后调用/// </summary>/// <param name="context"></param>public void OnActionExecuted(ActionExecutedContext context){_myName += " after";}}
    }
    
  5. 在控制器中应用自定义的 ActionFilterAttribute

    using Microsoft.AspNetCore.Mvc;
    using AttributeSample;
    using System.Reflection;namespace AttributeSample.Controllers
    {[ApiController][Route("[controller]")]public class WeatherForecastController : ControllerBase{private static readonly string[] Summaries = new[]{"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"};private readonly ILogger<WeatherForecastController> _logger;/// <summary>/// /// </summary>/// <param name="logger"></param>public WeatherForecastController(ILogger<WeatherForecastController> logger){_logger = logger;}[HttpGet(Name = "GetWeatherForecast")][TypeFilter(typeof(Test1ActionFilterAttribute))][TypeFilter(typeof(Test2ActionFilterAttribute))][Test3ActionFilter("Jacky")]public IEnumerable<WeatherForecast> Get(){var list = Enumerable.Range(1, 5).Select(index => new WeatherForecast{Date = DateTime.Now.AddDays(index),TemperatureC = Random.Shared.Next(-20, 55),Summary = Summaries[Random.Shared.Next(Summaries.Length)]}).ToArray();_logger.LogInformation("执行方法...");return list;}}
    }
    
  6. Swaager 测试,可以看到其执行顺序如下:

    AttributeSample.Test1ActionFilterAttribute: Information: 在控制器执行之前调用...
    AttributeSample.Test2ActionFilterAttribute: Information: 在控制器执行之前调用...
    AttributeSample.Test3ActionFilterAttribute...
    AttributeSample.Controllers.WeatherForecastController: Information: 执行方法...
    AttributeSample.Test3ActionFilterAttribute...
    AttributeSample.Test2ActionFilterAttribute: Information: 在控制器执行之后调用...
    AttributeSample.Test1ActionFilterAttribute: Information: 在控制器执行之后调用...
    

总结:

  1. Asp.net core webapi 使用 ActionFilterAttribute,引用的是 Microsoft.AspNetCore.Mvc.Filters 而不是 System.Web.Http.Filters
    • System.Web.Http.Filters 是属于 .Net FrameWork 的命名空间
  2. ActionFilterAttribute 如果需要在构造方法中注入某些依赖,比如注入 ILogger,有几个使用方法:
    • TypeFilter,无需在IOC中注册,有自实现,本文例子即是使用这种方式
    • ServiceFilter,需要在 Program.cs 中针对该过滤器注册服务才能使用
    • 自定义 CustomIOCFilterFactoryAttribute 实现,依然需要对过滤器进行服务注册
    • 方法2和3比较复杂,以后有时间再针对这两种方式写一些例子
  3. 没有注入其他依赖的 ActionFilterAttribute 如一般 Attribute 使用即可,比如本文的第 3 个 ActionFilterAttribute
    • [Test3ActionFilter("Jacky")]

我是老杨,一个执着于编程乐趣、至今奋斗在一线的 10年+ 资深研发老鸟,是软件项目管理师,也是快乐的程序猿,持续免费分享全栈实用编程技巧、项目管理经验和职场成长心得!欢迎关注老杨的公众号(名称:代码掌控者),和你共同探索代码世界的奥秘!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/800136.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

访问Github卡顿甚至进不去的解决办法(适用于Windows)

本文使用Watt Tookit(原Steam++)解决了Github在国内访问速度卡顿甚至无反应的问题,通过NDM和镜像网站实现Github大文件高速下载。本文首发自个人博客:点我查看 一、前言 Github 是全球知名的开源宝库,但是对国内用户并不友好。当我们在浏览器中输入www.github.com时,如果…

看看mysql干的恶心事

如图: 本文来自博客园,作者:河北大学-徐小波,转载请注明原文链接:https://www.cnblogs.com/xuxiaobo/p/18421514

LoRaWAN网关价格干穿地板了

曾经LoRaWAN网关要上万块钱一台,后来卷到千把块钱,现在可以卷到500以内,还支持4G/ETH/WIFI,应该也是没谁了。 先上图片1.1 产品特点 ◆ 高性能嵌入式硬件平台 ◆ 使用工业级 Cat.1 4G 模块 ◆ 宽压输入 DC 9~28V,工业级稳定性 ◆ 群脉冲:电源2kV,通讯线4kV ◆ 湿度范围…

认知神经科学分析指标——图论指标之全局集群系数

图论指标在认知神经科学或脑科学的研究中,通常作为研究脑网络表现的描述性指标之一,而图论指标从全局性来分可以分为:节点指标和全局指标,而根据描述脑网络整合性表现又可分为:整合指标和分离指标。 该随笔主要涉及图论指标中全局指标及整合指标的全局集群系数,英文全称为…

day4[大模型全链路开源开放体系学习小结]

书生浦语大模型全链路开源开放体系涵盖数据收集、标注、训练、微调、评测、部署等全链路,学习了解其技术发展、性能提升、模型架构、开源生态等。 书生浦语大模型(英文名IN Turn LLM)多次开源,性能不断提升,达到国际先进水平,在推理能力、上下文记忆、自主规划等方面表现…

深入理解ConcurrentHashMap

HashMap为什么线程不安全 put的不安全 由于多线程对HashMap进行put操作,调用了HashMap的putVal(),具体原因:假设两个线程A、B都在进行put操作,并且hash函数计算出的插入下标是相同的;当线程A执行完第六行由于时间片耗尽导致被挂起,而线程B得到时间片后在该下标处插入了元…

成都仪器定制-二进制补码及与原码的互相转换方法

大沙把一些基础的知识说清楚,本文介绍二进制补码及与原码的转换方法。 先说原码,原码‌是一种计算机中对数字的二进制定点表示方法。在原码表示法中,数值前面增加了一位符号位,最高位为符号位,0表示正数,1表示负数。其余位表示数值的大小。二进制补码‌是一种用于表示有符…

函数进阶应用3

认识OFFSET函数函数格式 参数说明 作用OFFSET(参数1,参数2,参数3,参数4,参数5) 参数1:以谁为标准参数2:下一多少行参数3:右移多少列参数4:取几行参数5:取几列 动态获取数据应用:使用offset函数获取表格最后五行数据,并计算平均值 在空白单元格输入“=offset()”,然…

程序员编写技术文章需要的四个辅助神器 ,强烈建议收藏 !

编写技术文章是程序员分享经验和记录学习成果的重要方式。 为了让写作变得更轻松,有许多实用工具可以帮助提升效率,比如 Markdown 编辑器、画图工具等。 接下来,笔者将介绍四款简单实用的工具,帮助程序员更轻松地编写技术文章。1 Typora :Markdown 编辑器 Typora 是一款简…

【专题】2024年9月游戏行业报告合集汇总PDF分享(附原数据表)

原文链接:https://tecdat.cn/?p=37732 在当今数字化高速发展的时代,游戏行业已然成为了文化与科技融合的前沿阵地。中国游戏行业凭借着不断创新的技术、丰富多元的内容以及日益拓展的市场,正以蓬勃之姿在全球舞台上绽放光彩。阅读原文,获取专题报告合集全文,解锁文末153份…

山东旅游攻略

目录山东概览地形图威海刘公岛 山东概览 地形图威海 刘公岛 最主要看中日甲午战争的遗址 参考视频 https://www.youtube.com/watch?v=55vH8J2s3Ow

基础靶机(CentOS7)自测练习WP

1信息收集 192.168.5.141:8090 open 192.168.5.141:8009 open 192.168.5.141:22 open 192.168.5.141:3306 open 192.168.5.141:6379 open 192.168.5.141:8080 open 192.168.5.141:8899 open 192.168.5.141:9080 open [*] alive ports len is: 8 start vulscan [*] WebTitle htt…