首页 > 编程语言 >Asp.Net Core webapi+net6 使用资源筛选器(过滤器) 做缓存

Asp.Net Core webapi+net6 使用资源筛选器(过滤器) 做缓存

时间:2023-10-10 14:46:48浏览次数:41  
标签:webapi Core Asp cache 缓存 context new ResourceFilter public

写一个特性类,用来做标记

[AttributeUsage(AttributeTargets.Method)] //只对方法有效
public class ResourceFilterAttribute : Attribute
{

}

我这里使用了MemoryCache来做缓存,也可以使用字典来做,但一定要加上static,否则字典每一次请求都会new一个实例,缓存的东西就丢了

private static Dictionary<string,object> caCheDic=new Dictionary<string, object>();

过滤器代码实现

public class ResourceFilter : IAsyncResourceFilter
    {
        private readonly IMemoryCache cache;

        public ResourceFilter(IMemoryCache cache)
        {
            this.cache = cache;
        }
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            //获取当前正在处理的控制器动作方法的相关信息,例如方法名、参数
            var actionDescriptor = context.ActionDescriptor as ControllerActionDescriptor;

            // 检查当前请求是否为 Controller Action
            if (actionDescriptor == null)
            {
                await next();
                return;
            }

            // 检查当前 Action 是否包含 ResourceFilterAttribute,如果没有则继续处理下一个中间件
            if (!actionDescriptor.MethodInfo.GetCustomAttributes(typeof(ResourceFilterAttribute), true).Any())
            {
                await next();
                return;
            }

            //把请求的ip和方法名当做缓存的key
            var cacheKey=context.HttpContext.Connection.RemoteIpAddress.ToString()+actionDescriptor.ActionName;
            //去缓存中找 如果有则直接返回
            if (cache.TryGetValue(cacheKey, out IActionResult resultFromCache))
            {
                context.Result= resultFromCache;
                return;
            }

            // 执行下一个中间件并获取结果
            var resultContext =await next();

            // 如果结果是 IActionResult 类型,则将结果缓存起来
            if (resultContext.Result is IActionResult actionResult)
            {
                //缓存时间
                var cacheOptions = new MemoryCacheEntryOptions()
                    .SetSlidingExpiration(TimeSpan.FromSeconds(10));
                cache.Set(cacheKey, actionResult, cacheOptions);
            }

            context.Result = resultContext.Result;
        }
    }

在program类中要注入MemoryCache

builder.Services.AddMemoryCache();

还要进行配置我们刚才写的筛选器

builder.Services.AddControllers().AddMvcOptions(option => {
    option.Filters.Add(typeof(ResourceFilter));
});

在需要进行缓存的action头上加上ResourceFilter特性,表示这个action的返回结果要进行缓存

[Route("api/[controller]/[action]"), ApiController]
    public class TestController : ControllerBase
    {
        List<SysUser> sysUsers = new List<SysUser>()
        {
            new SysUser("admin","123"),
            new SysUser("admin2","123")
        };
        [HttpGet, ResourceFilter]
        public List<SysUser> GetUsers() { return sysUsers; }
    }
    public record SysUser(string loginName,string loginPwd);

进行测试,我这里直接就是截图的第二次请求,可以看到,请求去缓存里面读到了数据
image

还有需要注意的是,尽量不要在缓存中存储IQuerytable和IEnumtable等具有延迟执行的类型或接口的数据,因为是延迟执行,IQuerytable和IEnumtable都是生成的sql语句,所以在使用ef时,这些数据还是会去进行数据库操作,这样我们的缓存也就没有意义了。

标签:webapi,Core,Asp,cache,缓存,context,new,ResourceFilter,public
From: https://www.cnblogs.com/cyfj/p/17754611.html

相关文章

  • ASP .Net Core: AutoMapper与DTO的使用(自定类型转换)
    建立DTO物件创建名为Dtos文件夹,并添加TodoListSelectDto文件publicclassTodoListSelectDto{publicGuidTodoId{get;set;}publicstringName{get;set;}=null!;publicDateTimeInsertTime{get;set;}publicDateTimeUpdateTime{get......
  • .Net Core 统一全局处理字符串为Null问题
    services.AddControllersWithViews().AddNewtonsoftJson(options=>{//设置序列化时间格式options.SerializerSettings.DateFormatString="yyyy-MM-ddHH:mm:ss";options.Serializ......
  • .Net Core 中GUID字符串的几种格式化
    NET下的Guid格式化有如下五种:1.Guid.NewGuid().ToString("N")获取32位不包含“-”号的GUID字符串例如:1c64d58a9e834bfe8d053555d81453d02.Guid.NewGuid().ToString("D")获取32位包含“-”号的GUID字符串,默认格式例如:ae8672ac-a987-43f3-a7c2-ac7b3249ac7b3.Guid.NewGuid().......
  • NetCore Ocelot 之 Cache
    OcelotsupportssomeveryrudimentarycachingatthemomentproviderbytheCacheManagerproject.Thissanamazingprojectthatissolvingalotofcachingproblems.IwouldrecommendusingthispackagetocachewithOcelot.Thefollowingexampleshowsh......
  • .net core 接收xml、text/plain格式参数
    1、接收xmlcontroller中写法如下[HttpPost,ActionName("Sign_off")][Produces("application/xml")]//接收[Consumes("application/xml")]//返回publicasyncTaskSign_off([FromBody]XmlDocumentxmldoc){.....//你的业务逻辑}Startup.cs中的ConfigureSer......
  • ASP .Net Core: 使用EF连接postgresql
    备注关于数据库的创建,可参考下方的链接,去创建测试环境,我已经有现成的数据库,故不再记录创建数据库的过程。实现步骤安装EF工具dotnettoolinstall--globaldotnet-ef安装其他依赖dotnetaddpackageNpgsql.EntityFrameworkCore.PostgreSQLdotnetaddpackageMicrosoft.E......
  • Asp-Net-Core开发笔记:EFCore统一实体和属性命名风格
    前言C#编码规范中,类和属性都是大写驼峰命名风格(PascalCase/UpperCamelCase),而在数据库中我们往往使用小写蛇形命名(snake_case),在默认情况下,EFCore会把原始的类名和属性名直接映射到数据库,这不符合数据库的命名规范。为了符合命名规范,而且也为了看起来更舒服,需要自己做命名转换......
  • 造轮子之asp.net core identity
    在前面我们完成了应用最基础的功能支持以及数据库配置,接下来就是我们的用户角色登录等功能了,在asp.netcore中原生Identity可以让我们快速完成这个功能的开发,在.NET8中,asp.netcoreidentity支持了WebApi的注册登录。这让我们在WebApi中可以更爽快的使用。安装包首先我们需要安......
  • NetCore Ocelot 之 Authorization
    Ocelotsupportsclaimsbasedauthorizationwhichisrunpostauthentication.ThismeansifouhavearouteyouwanttoauthorizeyoucanaddthefollowingtoyouRouteconfiguration."RouteClaimsRequirement":{"client_role":......
  • vasp5.4.4+vaspkit安装
    vasp用gnu编译安装是最方便的,下面这个教程非常完整好用vasp-GNU注意看下方评论,第7步更改第33行处,需要删掉-L。vaspkit从sourceforge下载vaspkit打开官网后,右键download获取直链用wget下载即可。解压后运行./setup.sh最后vim~/.vaspkit更改赝势文件路径即可。赝势路径......