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

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

时间:2023-11-04 12:44:26浏览次数:40  
标签: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/17809200.html

相关文章

  • NetCore 技术参考
    开发平台   1、数据模型   2、数据视图   3、界面模型   4、系统图标接口开发   1、接口设置   2、联动设置   3、调用日志代码生成   1、BLL业务逻辑层   2、DAL数据访问层   3、Model实体层   4、生成报表模板      5、EF......
  • 如何实施符合功能安全及ASPICE要求的模型动态测试 ——TPT Workshop邀请函
    尊敬的女士/先生:2023年3月,北汇信息与诸多工程师相约上海,成功举办了今年第一场TPTWorkshop活动,与大家进行了深入的技术交流。如今,2023年已渐渐步入尾声,我们将在北汇信息上海总部再次举办题为“如何实施符合功能安全及ASPICE要求的模型动态测试”的TPTWorkshop活动,诚邀各位新老......
  • .Net Core Aop之IActionFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理) 二、IActionFilter(同步)1、定义Fi......
  • .Net Core Aop之IResourceFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、IResourceFilter(同步资源缓存)1......
  • .Net Core AOP之IResultFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、IResultFilter(同步)1、定义Filt......
  • .Net Core AOP之IExceptionFilter
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、使用publicclassCustomerE......
  • Musescore常用操作备忘
    最近开始写歌,记录下经常用的一些操作目录添加文本折叠休止符添加小节删除小节添加乐器编辑双音、和弦钢琴键盘升高/降低音三连音多声部延音线连音线添加文本选中音符,按cmd+T折叠休止符折叠休止符,按下键盘上的M添加小节选择小节,右键->插入小节插入换行小节也可以插入水......
  • Aspose.Words for Java21.11去除水印和数量限制
    前言工欲善其事,必先利其器目前用到了word转pdf,然后开始研究大佬的文章,用于个人学习,首先感谢!源码分析1.下载Aspose.WordsforJava21.11官方jar包2.开始分析调用授权方法InputStreamis=newFileInputStream("..license.xml");Licenselicense=newLicense();license.setLi......
  • delphiXE7异步WebAPI
    废话不多说直接上源码:unitUnit1;interfaceusesWinapi.Windows,Winapi.Messages,System.SysUtils,System.Variants,System.Classes,Vcl.Graphics,Vcl.Controls,Vcl.Forms,Vcl.Dialogs,msxml2_tlb,Vcl.StdCtrls,comobj;typeTAjaxEvenFunc=procedure(d:Varia......
  • 如何让 WinDebug Preview 加载 Dotnet Core 的 SOS.dll 进行调试
    一、前言最近我在使用WinDebug进行系统调试,也是在学习《Net高级调试》这本书。以前听过WinDebug调试器,但是没有使用过,由于最近想起来了,就好好的研究一下,学习一下。初次接触,还是走了不少弯路,踩了不少坑。关于WinDebug最新版的安装方法,可以在“微软商店”里面,直接查询......