• 过滤器+缓存在.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方法打上断点

    1

    可以发现当第一次执行时步骤是:OnResourceExecuting==》controller接口 ==》OnResourceExecuted ==》结束

    第二次执行步骤是:OnResourceExecuting==》结束

    第一次进入OnResourceExecuting发现缓存中没有该Key 就跑到控制器层走原有的接口方法进行查询,走完进入OnResourceExecuted把这个Key和接口保存到缓存

    第二次执行时进入OnResourceExecuting 发现缓存中有这个缓存就把值赋值给Result就直接返回了

    代码:https://github.com/luchong0813/WeBlog

  • 相关阅读:
    Windows莫名内存到百分之百,需要修改虚拟内存
    idea中的springboot的maven项目报错Failed to clean project: Failed to delete D: ew_shunyishunyi argetshunyiWEB-INFclassesstatic
    VMware 启动虚拟机黑屏(Ubuntu)
    MySQL 8.0.18安装教程(windows 64位)
    ubunt中,使用命令su命令切换root账户,提示认证失败
    AngularJS 杂项知识点
    AngularJS $watch 性能杀手
    AngularJS controller as vm方式
    AngularJS 路由 resolve属性
    AngularJS $observe $watch
  • 原文地址:https://www.cnblogs.com/chonglu/p/15600603.html
Copyright © 2020-2023  润新知