一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - ASP.NET教程 - Asp.Net Core webapi+net6 使用資源篩選器(過濾器) 做緩存

Asp.Net Core webapi+net6 使用資源篩選器(過濾器) 做緩存

2023-12-19 00:05未知服務器之家 ASP.NET教程

寫一個特性類,用來做標記 [AttributeUsage(AttributeTargets.Method)] //只對方法有效public class ResourceFilterAttribute : Attribute{} 我這里使用了MemoryCache來做緩存,也可以使用字典來做,但一定要加上static,否則字典每一次請求都會new一個實例,

寫一個特性類,用來做標記

[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);

進行測試,我這里直接就是截圖的第二次請求,可以看到,請求去緩存里面讀到了數據
Asp.Net Core webapi+net6 使用資源篩選器(過濾器) 做緩存

還有需要注意的是,盡量不要在緩存中存儲IQuerytable和IEnumtable等具有延遲執行的類型或接口的數據,因為是延遲執行,IQuerytable和IEnumtable都是生成的sql語句,所以在使用ef時,這些數據還是會去進行數據庫操作,這樣我們的緩存也就沒有意義了。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: japan孕妇孕交freehd | 日本免费播放 | 猛h辣h高h文湿重口 门房秦大爷在线阅读 | 91国内精品线免费播放 | 亚洲午夜久久久 | 欧美一区二区三区在线观看免费 | 国产精品林美惠子在线观看 | 韩国黄色片网站 | 国产成人精品曰本亚洲77美色 | 亚洲123区 | freexxxx性大陆另类 | 色综合色狠狠天天久久婷婷基地 | 青青草国产精品久久久久 | 手机在线观看国产精选免费 | 2021国产精品视频 | 激情影院免费 | 国产高清免费午夜在线视频 | 日韩小视频在线观看 | 亚洲精品国产一区二区三区在 | 114级毛片免费观看 1024亚洲天堂 | 久久无码人妻中文国产 | 国产免费久久精品 | 深夜影院深a久久 | 日韩一品在线播放视频一品免费 | 亚洲丰满模特裸做爰 | 俄罗斯年轻男同gay69 | juliaann主妇疯狂 | 久热这里在线精品 | 色图18p | 赤坂丽女医bd无删减在线观看 | 精品无人区一区二区三区 | free性泰国女人hd | 6969精品视频在线观看 | 精品国产91高清在线观看 | 国产99热| 小妇人电影免费完整观看2021 | 成人欧美视频在线看免费 | 操老逼视频 | 成人精品一区久久久久 | 男男双性生子产乳高辣h | 天堂素人在线 |