资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回
发布日期: 2023-08-12 01:22:36 来源: 博客园


(资料图片仅供参考)

前言

上两篇文章分享了过滤器实现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中使用资源过滤器实现不执行Action方法体读取缓

  • EDG太懂上压力,粉丝问什么时候送走打野,Uzi何时一踢四

  • 日本男篮再增1名归化球员:渡边归队硬实力大增 三场热身赛出成果

  • 假面骑士:平成世代:永恒 集体观影活动开启,DX Valvarusher

  • 世茂集团:前7个月合约销售约311.2亿元

  • 反无人机手段【德信康】

  • 中牟县刁家乡“村BA”篮球友谊赛圆满闭幕

  • 去红河做生活家丨红红火火红河州,热热闹闹火把节!

  • 18岁男孩为买摩托车,将价值百万元房产以52万元卖掉!房子还能拿

  • 长丰县下塘镇:积极开展“守健康 帐有爱”志愿服务活动

  • 库迪狂开5000家店:升温的价格战,躺枪的同行

  • 枫桥式人民法庭创建丨婚约彩礼引起纠纷 温情调解当庭退还

  • 资管市场江湖生变:公募规模超银行理财 为何被指“矬子里拔大个

  • 厦门湖里区:发动辖区企业进院校举办专场招聘会

  • 广东惠州:支持发放住房消费券,拟优化四区落户条件

  • 光大信托回应“产品停兑”传闻:公司管理的信托产品运营正常

  • 【华晨宇水仙文】且听风吟9(海风/娱乐圈)

  • 安徽省委决定:宁波同志任芜湖市委书记

  • 刚刚,长春住宅地块出让,三环旁,楼面价「2」字头

  • 中国证监会与香港证监会就推动大宗交易(非自动对盘交易)纳入互

热点图集