1. 程式人生 > 其它 >過濾器+快取在.NET5WebApi專案中的簡單使用

過濾器+快取在.NET5WebApi專案中的簡單使用

在一些專案中往往會使用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就直接返回了

程式碼:https://github.com/luchong0813/WeBlog