资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回

资源,过滤器,mvc,使用,实现,执行,action,方法,读取,缓存,信息,返回 · 浏览次数 : 51

小编点评

**资源过滤器** * 是一种 AOP 策略,用于在执行管道的特定阶段执行代码。 * 实现接口 `IResourceFilter` 或 `IAsyncResourceFilter`。 * 在 `OnResourceExecuted` 和 `OnResourceExecuting` 方法中执行资源过滤器。 * 可以缓存请求结果,实现短路请求。 **具体实现** * `MyResourceFilter` 类中实现 `OnResourceExecuted` 和 `OnResourceExecuting` 方法。 * 在 `OnResourceExecuted` 方法中,检查当前请求的路由路径,并根据路径获取缓存结果。 * 在 `OnResourceExecuting` 方法中,从内存中获取缓存结果,并将结果返回。 **验证** 在 `Test` 方法中,首先从内存中获取缓存结果,如果为空,则将当前时间作为缓存值。 如果 `key` 的值存在,则从 `key` 中获取缓存结果并返回。 如果 `key` 的值不存在,则认为这是一个第一次请求,则直接返回缓存结果。

正文

前言

上两篇文章分享了过滤器实现JWT进行鉴权,分别是通过授权过滤器和操作过滤器实现,这两个过滤器也是最常用的。文章链接:授权过滤器—MVC中使用授权过滤器实现JWT权限认证操作过滤器—MVC中使用操作过滤器实现JWT权限认证,接下来将简单的谈谈资源过滤器在MVC中如何使用,一般项目中这个过滤器很少用到。

一、什么是资源过滤器?

过滤器(Filter)是 AOP(面向切面编程) 思想的一种实现,供我们在执行管道的特定阶段执行代码,通过使用过滤器可以实现短路请求、缓存请求结果、日志统一记录、参数合法性验证、异常统一处理、返回值格式化 等等,同时使业务代码更加简洁单纯,避免很多重复代码。所以在我们的过滤器中,大部分过滤器有开始执行action,即ing 状态的方法,也有action业务代码执行完后触发的ed状态的方法。

资源过滤器在过滤器管道中第二个被执行,通常用于请求结果的缓存和短路过滤器管道,通过实现接口 IResourceFilter 或者IAsyncResourceFilter。和其他过滤器一样,实现接口,只是接口不同,接收的参数两类型不同,但是这也正意味着执行的时机不同。接收的参数类型为:ResourceExecutedContext
image

二、资源过滤器实现

资源过滤器定义:

资过滤器的定义,需要实现接口 IResourceFilter 或者IAsyncResourceFilter,接收的参数类型为:ResourceExecutedContext。

   /// <summary>
    /// 资源过滤器
    /// </summary>
    public class MyResourceFilter : Attribute, IResourceFilter//过滤器要继承Attribute 特性,这样我们也可以当做特性使用
    {
        /// <summary>
        /// 内存缓存对象
        /// </summary>
        private readonly IMemoryCache _memoryCache;
        /// <summary>
        /// 构造注入
        /// </summary>
        public MyResourceFilter(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
        /// <summary>
        /// 资源过滤器过滤器执行之前(befor)
        /// </summary>
        /// <param name="context"></param>
        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);
            }
        }
        /// <summary>
        /// 资源过滤器过滤器执行之后(after)
        /// </summary>
        /// <param name="context"></param>
        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<MyResourceFilter>();
    });

添加测试Action:

/// <summary>
    /// 资源过滤器测试
    /// </summary>
    public class ResourceFilterController : ControllerBase
    {
        /// <summary>
        /// 内存缓存对象
        /// </summary>
        private readonly  IMemoryCache _memoryCache;
        /// <summary>
        /// 构造注入
        /// </summary>
        /// <param name="memoryCache"></param>
        public ResourceFilterController(IMemoryCache memoryCache)
        {
            _memoryCache = memoryCache;
        }
         
        /// <summary>
        /// 资源过滤器测试,获取接口第一次调用时间
        /// 如果第一次调用Action:会进入Action执行方法体
        /// 如果不是第一次调用Action:在资源过滤器中直接短路返回第一次调用时间
        /// </summary>
        /// <returns></returns>
        [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

image

第N次调用:

image

与资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回相似的内容:

资源过滤器—MVC中使用资源过滤器实现不执行Action方法体读取缓存信息返回

## 前言 上两篇文章分享了过滤器实现JWT进行鉴权,分别是通过授权过滤器和操作过滤器实现,这两个过滤器也是最常用的。文章链接:[授权过滤器—MVC中使用授权过滤器实现JWT权限认证](https://www.cnblogs.com/wml-it/p/17612434.html),[操作过滤器—MV

【Android 逆向】【ARM汇编】 全局资源重定位

资源重定位解释: 字符串反汇编代码解释: .rodata:00001E20 __exidx_end DCB "a + b = %d" ; DATA_XREF: main+28^o .rodata 所在段名 00001E20 偏移地址 __exidx_end IDA 给的一个字符串名称 DCB IDA

过亿云资源运维管控难?华为云CloudMap带你喝着咖啡做运维

摘要:华为云站点数字化平台CloudMap携手华为云图引擎GES打造云服务全栈拓扑,网络流量路径和云服务动态依赖等空间关系数据,支撑现网运行态风险识别和分钟级定位定界,构建业界领先的数字化能力。 本文分享自华为云社区《构建站点数字孪生,支撑确定性运维:华为云九洲云图CloudMap》,作者:HWCl

资源成本降低70%!华为MetaERP资产核算的Serverless架构实践

华为MetaERP资产核算系统使用华为云函数工作流FunctionGraph(基于元戎内核)微服务serverless化解决方案,实现了复杂企业应用MetaSaaS Serverless化,成本节约70%。

数仓资源管控理论已掌握,是时候实战了

华为云GaussDB(DWS)技术布道师吕鹏博,针对GaussDB(DWS) 资源管控的原理和系统运维实践带来了精彩分享。

[转帖]Cgroups资源限制

https://cloud.tencent.com/developer/article/2108816?areaSource=105001.13&traceId=QzVtWN5jGl8zeYZLJPJjV 一、Cgroups介绍 Cgroups是什么? Cgroups是control groups的

[转帖]Docker资源(CPU/内存/磁盘IO/GPU)限制与分配指南

https://zhuanlan.zhihu.com/p/417472115 什么是cgroup? cgroups其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等)。 什么是Docker资源限制? 默

Blazor资源大全,很棒的Blazor

# Blazor资源大全 [![Awesome](https://awesome.re/badge-flat2.svg)](https://awesome.re) [](https://dotnet.microsoft.com/apps/aspnet/web-apps/client) > 一个收集了

前端资源公共cdn哪里找

写一些demo的时候使用vue/react脚手架来初始项目太小题大做,直接在html中写代码需要找到一些框架和库的cdn,这里做下推荐,仅限在测试环境用。 bootcdn 优点:是国内速度快,使用简单。 缺点:是资源有限,比如vue目前只有3.x版本,没有2.x版本 unpkg 缺点: 优势网络会中

C++ 资源大全:标准库、Web框架、人工智能等 | 最全整理

C++ 资源列表,内容包括: 标准库、Web应用框架、人工智能、数据库、图片处理、机器学习、日志、代码分析等 目录 进程间通信 Json 日志 机器学习 数学 内存分配 多媒体 网络 PDF 物理学 映射 正则表达式 机器人学 科学计算 脚本 序列化 排序 视频 虚拟机 Web应用框架 XML 多项