zoukankan      html  css  js  c++  java
  • 过滤器+缓存在.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

  • 相关阅读:
    098实战 Job的调度
    maven在windows下的安装
    Map的知识点梳理(不包含collections工具类)
    001 LRU-缓存淘汰算法
    Android渲染机制和丢帧分析
    Android性能优化典范
    正确使用Android性能分析工具——TraceView
    android View 绘制完成监听
    那些年我们用过的显示性能指标
    view, surfaceView, invalidate, postInvalidate, 刷新屏幕
  • 原文地址:https://www.cnblogs.com/chonglu/p/15600603.html
Copyright © 2011-2022 走看看