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

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

时间:2023-11-07 15:47:22浏览次数:101  
标签: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/17815126.html

相关文章

  • asp.net中怎样用Javascript控制RequiredFieldValidator控件什么时候启用,什么时候不启
    Enable/DisableRequiredFieldValidatorwithJavascriptdocument.getElementById("requiredfieldvalidatorid").enabled=false;<asp:DropDownListID="ddlServiceName"runat="server"onchange='varDateValidator=docume......
  • ASP.NET性能计数器
       ASP.NET支持两组性能计数器:系统和应用程序。前者在ASP.NET性能计数器对象中的PerfMon中公开;后者在ASP.NETApplications性能对象中公开。ASP.NET性能对象中的StateServerSessions计数器(仅适用于在其中运行状态服务器的服务器计算机)和ASP.NETApplications性能......
  • ASP.NET和Oracle连接问题的解决方法 - Unable to load DLL (oci.dll)
    以下适用于Windows2003:不少人在做ASP.NET+Oracle开发的时候都会碰到连接问题,提示“UnabletoloadDLL(oci.dll)”,但这个文件在系统中是存在的,很多人为此焦头烂额,我看到很多的帖子都是求助这个问题的。其实并非所有的人都会碰到这个问题,只在于用硬盘分区格式为NTFS的用户,既然oci.......
  • Visual Studio 2008安装ASP.NET MVC 2 RTM
    1首先,要安装VisualStudio2008SP1,下载地址http://www.microsoft.com/en-us/download/details.aspx?id=109862下载ASP.NETMVC2RTM(英文版,2.5M,AspNetMVC2_VS2008.exe)下载地址http://www.microsoft.com/en-us/download/details.aspx?id=220793双击AspNetMVC2_VS2008.e......
  • Asp.Net Core实战(干货)
    序言使用.NETCore,团队可以更容易专注的在.netcore上工作。比如核心类库(如System.Collections)的更改仍然需要与.NETFramework相同的活力,但是ASP.NETCore或EntityFrameworkCore可以更轻松地进行实质性更改,而不受向后兼容性的限制。.NETCore借鉴了.NETFramework的最佳实践,并......
  • .Net Core AOP之AuthorizeAttribute
    一、简介在.netcore中Filter分为以下六大类:1、AuthorizeAttribute(权限验证)2、IResourceFilter(资源缓存)3、IActionFilter(执行方法前后的记录)4、IResultFilter(结果生成前后扩展)5、IAlwaysRun(响应结果的补充)6、IExceptionFilter(异常处理)二、AuthorizeAttribute(权限验证)......
  • .Net Core之JWT授权
    一、什么是JWT文章参考:https://www.leo96.com/article/detail/55JSONWeb令牌(JWT)是一个开放标准(RFC7519),它定义 了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或EC......
  • 在ASP.NET MVC框架中,如何处理多个提交按钮?
    内容来自DOChttps://q.houxu6.top/?s=在ASP.NETMVC框架中,如何处理多个提交按钮?在ASP.NETFrameworkBeta中,有几种方法可以处理同一表单中的多个提交按钮。一种方法是使用一个隐藏字段来区分不同的提交按钮。例如:<%Html.BeginForm("MyAction","MyController",FormMethod......
  • EF Core 关系配置
    一、一对多publicclassArticle{publiclongId{get;set;}//主键publicstringTitle{get;set;}//标题publicstringContent{get;set;}//内容publicList<Comment>Comments{get;set;}=newList<Comment>();//此文章的若干条评论}......
  • Metasploit windows 调试环境搭建
    Metasploitwindows调试环境搭建安装ruby首先确定metasploit的ruby版本metasploit-framework/.ruby-version3.0.5在https://rubyinstaller.org/downloads/archives/下载对应版本的Ruby+DevkitInstallers(x64),默认配置安装即可。输入ruby-v查看是否安装成功安装gem......