過濾器+快取在.NET5WebApi專案中的簡單使用
阿新 • • 發佈:2021-11-24
在一些專案中往往會使用Redis用作快取查詢,授權等,這裡簡單記錄一下在.NET WebApi專案中使用過濾器+MemoryCache實現快取查詢
1、Startup中註冊快取服務
services.AddMemoryCache();
2、建立一個自定義過濾器(這裡使用資源過濾器)
public class CustomResourceFilteAttribute : Attribute, IResourceFilter { public void OnResourceExecuted(ResourceExecutedContext context) { } public void OnResourceExecuting(ResourceExecutingContext context) { } }
注意這裡繼承了Attribute,因為到時候可以把它當作註解直接在控制器中使用,繼承IResourceFilter然後實現它的兩個方法,這裡以資源過濾器為例
3、通過構造注入快取
private readonly IMemoryCache _Cache;
public CustomResourceFilteAttribute(IMemoryCache cache)
{
_Cache = cache;
}
4、實現IResourceFilter介面方法
public void OnResourceExecuted(ResourceExecutedContext context) { var path = context.HttpContext.Request.Path; var route = context.HttpContext.Request.QueryString.Value; var key = path + route; _Cache.Set(key, context.Result); } public void OnResourceExecuting(ResourceExecutingContext context) { var path=context.HttpContext.Request.Path; //api/BlogPost var route = context.HttpContext.Request.QueryString.Value; //?page=1&size=2 var key = path + route; if (_Cache.TryGetValue(key, out object value)){ context.Result = value as IActionResult; } }
通過上下文獲取到請求路勁和路由,拼接起來作為快取的Key
在OnResourceExecuting方法中通過TryGetValue嘗試獲取我們拼接好的Key,如果存在,就直接把value轉換後給到上下文的Result返回
5、使用特性
[TypeFilter(typeof(CustomResourceFilteAttribute))] [HttpGet] public async Task<ActionResult<ApiResult>> Get([FromServices]IMapper iMapper, int page,int size)
6、除錯看執行步驟
分別在控制器介面方法、OnResourceExecuted方法、OnResourceExecuting方法打上斷點
可以發現當第一次執行時步驟是:OnResourceExecuting==》controller介面 ==》OnResourceExecuted ==》結束
第二次執行步驟是:OnResourceExecuting==》結束
第一次進入OnResourceExecuting發現快取中沒有該Key 就跑到控制器層走原有的介面方法進行查詢,走完進入OnResourceExecuted把這個Key和介面儲存到快取
第二次執行時進入OnResourceExecuting 發現快取中有這個快取就把值賦值給Result就直接返回了