.NET 使用 IResourceFilter 进行资源缓存

一、使用演示

  1. 创建 CustomResourceFilter 实现类
csharp 复制代码
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IResourceFilter
    {


        /// <summary>
        /// 在xxx资源之前
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            Console.WriteLine("before");
        }

        /// <summary>
        /// 在xxx资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("after");
        }

    }
}
  1. 在需要过滤的方法上添加注解[CustomResourceFilter],填写参数名为刚刚创建的类名
  1. 测试

二、应用场景------缓存

2.1 演示代码

csharp 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IResourceFilter
    {

        // 定义一个缓存区域
        private static Dictionary<string,object> cache = new Dictionary<string, object>();

        /// <summary>
        /// 在xxx资源之前
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuting(ResourceExecutingContext context)
        {
            // 如果有缓存,则返回缓存值
            string key = context.HttpContext.Request.Path;
            if (cache.ContainsKey(key))
            {
                Console.WriteLine("有缓存了,调用缓存");
                // 只要是给result赋值了,就会终止执行,直接返回结果给调用方
                context.Result = (IActionResult?)cache[key];
            }
        }

        /// <summary>
        /// 在xxx资源之后
        /// </summary>
        /// <param name="context"></param>
        public void OnResourceExecuted(ResourceExecutedContext context)
        {
            Console.WriteLine("方法已经执行了,将结果存入缓存");
            string key = context.HttpContext.Request.Path;
            // 计算结果保存到缓存中
            cache[key] = context.Result;
        }

    }
}

2.2 测试

三、 异步版本 IAsyncResourceFilter

3.1 演示代码

csharp 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IAsyncResourceFilter
    {
        /// <summary>
        /// 当xxx资源去执行时
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            await Console.Out.WriteLineAsync("异步方法执行前");

            ResourceExecutedContext resourceExecutedContext = await next.Invoke();

            await Console.Out.WriteLineAsync("异步方法执行后");
        }
    }
}

3.2 代码改造

csharp 复制代码
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;

namespace StartUp.Filters
{
    public class CustomResourceFilter : Attribute, IAsyncResourceFilter
    {

        // 定义一个缓存区域
        private static Dictionary<string, object> cache = new Dictionary<string, object>();

        /// <summary>
        /// 当xxx资源去执行时
        /// </summary>
        /// <param name="context"></param>
        /// <param name="next"></param>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        public async Task OnResourceExecutionAsync(ResourceExecutingContext context, ResourceExecutionDelegate next)
        {
            string key = context.HttpContext.Request.Path;
            if (cache.ContainsKey(key))
            {
                Console.WriteLine("有缓存了,调用缓存");
                // 只要是给result赋值了,就会终止执行,直接返回结果给调用方
                context.Result = (IActionResult?)cache[key];
            }
            else
            {
                ResourceExecutedContext resourceExecutedContext = await next.Invoke();
                Console.WriteLine("方法已经执行了,将结果存入缓存");
                // 计算结果保存到缓存中
                cache[key] = context.Result;
            }
        }
    }
}
相关推荐
白宇横流学长25 分钟前
基于SpringBoot实现的冬奥会科普平台设计与实现【源码+文档】
java·spring boot·后端
Python编程学习圈1 小时前
Asciinema - 终端日志记录神器,开发者的福音
后端
bing.shao1 小时前
Golang 高并发秒杀系统踩坑
开发语言·后端·golang
壹方秘境1 小时前
一款方便Java开发者在IDEA中抓包分析调试接口的插件
后端
brzhang2 小时前
A2UI:但 Google 把它写成协议后,模型和交互的最后一公里被彻底补全
前端·后端·架构
开心猴爷2 小时前
iOS App 性能测试中常被忽略的运行期问题
后端
SHERlocked932 小时前
摄像头 RTSP 流视频多路实时监控解决方案实践
c++·后端·音视频开发
AutoMQ3 小时前
How does AutoMQ implement a sub-10ms latency Diskless Kafka?
后端·架构
Rover.x3 小时前
Netty基于SpringBoot实现WebSocket
spring boot·后端·websocket
疯狂的程序猴3 小时前
用 HBuilder 上架 iOS 应用时如何管理Bundle ID、证书与描述文件
后端