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

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

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時,這些數據還是會去進行數據庫操作,這樣我們的緩存也就沒有意義了。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 高h生子双性美人受 | 精品一区二区三区高清免费观看 | 欧美一级视 | 日本红怡院亚洲红怡院最新 | 热99这里有精品综合久久 | 99久久99热久久精品免 | 99re在线视频观看 | 日本在线亚州精品视频在线 | 国语第一次处破女 | 午夜伦伦电影理论片费看 | 欧美色精品天天在线观看视频 | 免费一级毛片在线播放放视频 | 亚洲国产高清视频 | 亚州一区二区 | 成年女人毛片免费观看97 | 欧美日韩国产成人综合在线影院 | 欧美日韩中文字幕久久伊人 | 女仆色永久免费网站 | 狠狠综合视频精品播放 | 欧美人妖另类性hd | 国产愉拍精品视频手机 | 日本美女视频韩国视频网站免费 | 99视频在线免费 | 日韩精品亚洲一级在线观看 | 亚洲精品在看在线观看 | 欧美兽皇video | 精品视频免费在线观看 | 青久久| 亚洲国产精品久久无套麻豆 | 久久两性视频 | 麻豆网站在线观看 | 四虎影院免费视频 | 久久精品AV一区二区无码 | 免费免费啪视频在线观播放 | 毛片手机在线视频免费观看 | 婷婷色网 | 日韩精品视频在线播放 | www.一区| 波多野结衣亚洲一区 | 波多野结衣在线免费观看 | 欧美白虎逼 |