.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;
            }
        }
    }
}
相关推荐
用户21411832636021 天前
Qwen3-Coder 实战!历史人物短视频一键生成,多分镜人物不崩,魔搭直接玩
后端
追逐时光者1 天前
C#/.NET/.NET Core技术前沿周刊 | 第 54 期(2025年9.8-9.14)
后端·.net
追逐时光者1 天前
C#/.NET/.NET Core编程技巧练习集,配套详细的文章教程讲解!
后端·.net
AD钙奶-lalala1 天前
SpringBoot实现WebSocket服务端
spring boot·后端·websocket
moxiaoran57531 天前
Flask学习笔记(一)
后端·python·flask
你的人类朋友1 天前
🔒什么是HMAC
后端·安全·程序员
盖世英雄酱581361 天前
Read timed out问题 排查
java·数据库·后端
BXCQ_xuan1 天前
软件工程实践二:Spring Boot 知识回顾
java·spring boot·后端
o0o_-_1 天前
【go/gopls/mcp】官方gopls内置mcp server使用
开发语言·后端·golang
苏三说技术1 天前
为什么不建议在 Docker 中跑 MySQL?
后端