资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回
(资料图片仅供参考)
前言
上两篇文章分享了过滤器实现JWT进行鉴权,分别是通过授权过滤器和操作过滤器实现,这两个过滤器也是最常用的。文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证,操作过滤器—MVC中使用操作过滤器实现JWT权限认证,接下来将简单的谈谈资源过滤器在MVC中如何使用,一般项目中这个过滤器很少用到。
一、什么是资源过滤器?
过滤器(Filter)是 AOP(面向切面编程) 思想的一种实现,供我们在执行管道的特定阶段执行代码,通过使用过滤器可以实现短路请求、缓存请求结果、日志统一记录、参数合法性验证、异常统一处理、返回值格式化 等等,同时使业务代码更加简洁单纯,避免很多重复代码。所以在我们的过滤器中,大部分过滤器有开始执行action,即ing 状态的方法,也有action业务代码执行完后触发的ed状态的方法。
资源过滤器在过滤器管道中第二个被执行,通常用于请求结果的缓存和短路过滤器管道,通过实现接口 IResourceFilter或者IAsyncResourceFilter。和其他过滤器一样,实现接口,只是接口不同,接收的参数两类型不同,但是这也正意味着执行的时机不同。接收的参数类型为:ResourceExecutedContext
。
二、资源过滤器实现
资源过滤器定义:
资过滤器的定义,需要实现接口 IResourceFilter 或者IAsyncResourceFilter,接收的参数类型为:ResourceExecutedContext。
/// /// 资源过滤器 /// public class MyResourceFilter : Attribute, IResourceFilter//过滤器要继承Attribute 特性,这样我们也可以当做特性使用 { /// /// 内存缓存对象 /// private readonly IMemoryCache _memoryCache; /// /// 构造注入 /// public MyResourceFilter(IMemoryCache memoryCache) { _memoryCache = memoryCache; } /// /// 资源过滤器过滤器执行之前(befor) /// /// public void OnResourceExecuted(ResourceExecutedContext context) { //针对哪些Action,也可以吧特性标注在Action上 var ad = context.ActionDescriptor; var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"]; if (str != "ResourceFilter/Test") { return; } //我们可以将当前的结果context.Result缓存起来,当执行ing时,直接返回,为了方便示例演示,我们用时间表示。 string content = "Action第一次执行调用时间:" + DateTime.Now; var value = _memoryCache.Get("key"); //判断内存中是否有内容,有就直接返回,不再执行action过程。 if (value == null) { _memoryCache.Set("key", content); } } /// /// 资源过滤器过滤器执行之后(after) /// /// public void OnResourceExecuting(ResourceExecutingContext context) { //针对哪些Action,也可以吧特性标注在Action上 var ad = context.ActionDescriptor; var str = ad.RouteValues["controller"] + "/" + ad.RouteValues["action"]; if (str != "ResourceFilter/Test") { return; } var content = _memoryCache.Get("key"); //判断内存中是否有内容,有就直接返回,不再执行action过程。 if (content != null) { var result = new { IsSuccess = true, Msg= _memoryCache.Get("key") }; //短路返回,不会再执行Action中方法和OnResourceExecuted方法 context.Result = new ContentResult() { Content = Newtonsoft.Json.JsonConvert.SerializeObject(result) }; }; } }
添加到全局过滤器:
services.AddMvc(options => { options.Filters.Add(); });
添加测试Action:
/// /// 资源过滤器测试 /// public class ResourceFilterController : ControllerBase { /// /// 内存缓存对象 /// private readonly IMemoryCache _memoryCache; /// /// 构造注入 /// /// public ResourceFilterController(IMemoryCache memoryCache) { _memoryCache = memoryCache; } /// /// 资源过滤器测试,获取接口第一次调用时间 /// 如果第一次调用Action:会进入Action执行方法体 /// 如果不是第一次调用Action:在资源过滤器中直接短路返回第一次调用时间 /// /// [HttpGet] public ActionResult Test() { string content = "Action第一次执行调用时间:" + DateTime.Now; var value = _memoryCache.Get("key"); //判断内存中是否有内容,有就直接返回,不再执行action过程。 if (value == null) { _memoryCache.Set("key", content); } return Ok(new { IsSuccess = true, Msg = content }); } }
三、验证:
第1次调用:
访问地址:
https://localhost:5001/ResourceFilter/Test
第N次调用:
建群声明:本着技术在于分享,方便大家交流学习的初心,特此建立【编程内功修炼交流群】,热烈欢迎各位爱交流学习的程序员进群,也希望进群的大佬能不吝分享自己遇到的技术问题和学习心得!
关键词:
相关阅读
-
资源过滤器—MVC中使用资源过滤器实现不...
前言上两篇文章分享了过滤器实现JWT进行鉴权,分别是通过授权过滤器 -
2023年8月云南废钢产业走访调研报告
调研时间:2023年8月1日-8月3日调研地点:曲靖、昆明调研方式:实地走 -
室温超导真假难辨?韩国人或已遥遥领先...
这两天被翻出来的韩国LK团队申请的国际专利,实际上在3月份就已经被公 -
新手机上贴的“进网试用”能不能撕?答...
新手机上贴的“进网试用”能不能撕?答案来了快告诉家人 -
苏仙岭景区即将免费开放:人民群众的笑...
红网时刻新闻8月9日讯 “山水画卷,郴州相见”,作为郴州市委、市 -
三国中最忠烈的三位大将,宁死不向敌军...
三国中最忠烈的三位大将,宁死不向敌军投降,连关羽不在其中!,三国是 -
广西南宁将暴雨预警提升为红色
截至目前,南宁消防已经接到了数起警情求助,目前正在处置中。提示广大 -
刘晓宇热身赛受伤 初步诊断左脚崴脚&伤...
刘晓宇热身赛受伤初步诊断左脚崴脚&伤处有些肿,崴脚,辽宁队,北京首钢, -
广州社保个人缴费明细查询方法有哪些?2...
一、广州市人社局网上服务大厅查询查询入口:(一)怎么登录账号:个人 -
前7月铁路完成固定资产投资3713亿元 同...
记者从中国国家铁路集团有限公司(以下简称“国铁集团”)获悉:今... -
离婚后前夫总想纠缠我乔言顾烨霆小说全...
乔言在发现顾烨霆和女明星亲密解除后,决定与她离婚,可没想到的是这一 -
浙江农商联合银行迎来新行长 陈博恺接...
日前,国家金融监督管理总局浙江监管局发布批复显示,核准陈博恺的浙江 -
“抖出万宁创文范儿”抖音短视频大赛启动
海南日报万城8月10日电(记者张惠宁)海南日报记者8月9日从万宁市委宣 -
老字号越来越“潮”了
老字号越来越“潮”了 -
京昆高速改扩建项目渭河特大桥合龙
“道虽阻,行则将至。”京昆高速公路改扩建5标项目渭河特大桥10日合... -
北京三部门:帮扶市场主体支持灾后重建
新华财经北京8月11日电国家金融监督管理总局北京监管局、中国人民银行 -
广东女网红开车送货遇害案一审宣判:凶...
8月11日,广东省茂名市中级人民法院对陈某彬犯故意杀人罪和侮辱尸体罪 -
深圳惠台政策汇编系列4.0版发布 为台企...
01:34深圳新闻网2023年8月11日讯(记者钟亚萍)8月10日,深圳台办发布2 -
杭州夫妻投靠落户条件(婚龄+住所+居住证)
杭州夫妻投靠落户条件婚龄:满2年(以结婚证登记日期为准)住所条件: -
路特斯2023年上半年业绩创历史新高
近日,路特斯宣布,2023年上半年业绩创历史新高。路特斯集团CEO冯擎峰