当前位置: 首页 > news >正文

ASP.NET Core Web API中实现缓存

在.NET 6中,你可以使用几种方式来实现缓存,但最直接的方法之一是使用ResponseCaching中间件或自定义的ActionFilterAttribute(动作过滤器)。

1. 使用ResponseCaching中间件

ASP.NET Core 提供了一个内置的ResponseCaching中间件,它可以很容易地配置来缓存HTTP响应。这对于静态内容和一些动态内容(如基于查询参数的响应)非常有用。

首先,在Program.csStartup.cs中启用响应缓存中间件:

// 在Program.cs中(针对.NET 6)  
var builder = WebApplication.CreateBuilder(args);  // 添加响应缓存服务  
builder.Services.AddResponseCaching();  var app = builder.Build();  // 使用响应缓存中间件  
if (!app.Environment.IsDevelopment())  
{  app.UseResponseCaching();  
}  // 其余配置...  app.Run();

然后,你可以通过属性或中间件配置来控制哪些响应应该被缓存。例如,在Controller或Action上使用[ResponseCache]属性:

[ApiController]  
[Route("[controller]")]  
public class ValuesController : ControllerBase  
{  [HttpGet]  [ResponseCache(Duration = 10, Location = ResponseCacheLocation.Client)]  public IActionResult Get()  {  // 假设这里是一些耗时的操作  return Ok(new string[] { "value1", "value2" });  }  
}

2. 自定义ActionFilterAttribute实现缓存

如果你需要更复杂的缓存逻辑(比如基于缓存键的动态内容),你可能需要实现一个自定义的ActionFilterAttribute

public class CacheFilterAttribute : ActionFilterAttribute  
{  private readonly IMemoryCache _cache;  public CacheFilterAttribute(IMemoryCache cache)  {  _cache = cache;  }  public override async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)  {  // 假设这里有一个简单的缓存键生成逻辑  var cacheKey = $"CacheFilter-{context.HttpContext.Request.Path}-{context.HttpContext.Request.QueryString}";  if (_cache.TryGetValue(cacheKey, out var cachedResponse))  {  // 缓存命中,返回缓存的内容  context.Result = new ObjectResult(cachedResponse)  {  StatusCode = StatusCodes.Status200OK  };  }  else  {  // 缓存未命中,继续执行Action  var resultContext = await next();  // 将结果缓存起来  _cache.Set(cacheKey, await resultContext.Result.ExecuteAsync(context.HttpContext.Response.Body), TimeSpan.FromMinutes(10));  // 注意:这里实际上并没有改变执行流程,只是为了演示如何缓存结果  // 正常情况下,你应该直接返回resultContext.Result  }  }  
}  // 在Controller或Action上应用  
[ServiceFilter(typeof(CacheFilterAttribute))]

注意:上面的自定义缓存过滤器示例为了简化,直接在OnActionExecutionAsync中进行了缓存逻辑的处理,但这种方式实际上并不推荐用于生产环境,因为它会改变正常的请求处理流程(如直接返回缓存结果而不是执行Action)。通常,你可能需要在OnResultExecutionAsync中处理缓存逻辑,并在缓存未命中时调用next()来执行Action。

另外,请注意,当使用自定义过滤器进行缓存时,务必处理好并发和缓存失效等问题。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • Java设计模式-策略模式
  • 无人机培训机构培训计划详解
  • Excel VBA批量获取文件夹内文件名及重命名文件教程
  • 音频进阶学习一——模拟信号和数字信号
  • 8.6.数据库基础技术-数据库的控制
  • LVS理论知识
  • 软件设计之MySQL(1)
  • Oracle(62)什么是内存优化表(In-Memory Table)?
  • 【数据结构】在链式存储结构上建立一棵二叉树的算法
  • 日撸Java三百行(day22:二叉树的存储)
  • Python | Leetcode Python题解之第335题路径交叉
  • Python实战项目:天气数据爬取+数据可视化(完整代码)
  • 【微信小程序】实现中英文切换
  • 100 Exercises To Learn Rust 挑战!准备篇
  • 掌握网络数据的钥匙:Python Requests-HTML库深度解析
  • 【刷算法】求1+2+3+...+n
  • C++入门教程(10):for 语句
  • Java的Interrupt与线程中断
  • mongo索引构建
  • Otto开发初探——微服务依赖管理新利器
  • swift基础之_对象 实例方法 对象方法。
  • Theano - 导数
  • Vue组件定义
  • 程序员最讨厌的9句话,你可有补充?
  • 从零搭建Koa2 Server
  • 京东美团研发面经
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 一份游戏开发学习路线
  • 一起来学SpringBoot | 第三篇:SpringBoot日志配置
  • 【云吞铺子】性能抖动剖析(二)
  • raise 与 raise ... from 的区别
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 湖北分布式智能数据采集方法有哪些?
  • 如何在招聘中考核.NET架构师
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ​​​​​​​sokit v1.3抓手机应用socket数据包: Socket是传输控制层协议,WebSocket是应用层协议。
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • # 移动硬盘误操作制作为启动盘数据恢复问题
  • (2)STM32单片机上位机
  • (3)nginx 配置(nginx.conf)
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)计算机毕业设计ssm基于B_S的汽车售后服务管理系统
  • (六)c52学习之旅-独立按键
  • (论文阅读30/100)Convolutional Pose Machines
  • (十七)Flink 容错机制
  • (学习日记)2024.03.25:UCOSIII第二十二节:系统启动流程详解
  • (一)UDP基本编程步骤
  • (转)真正的中国天气api接口xml,json(求加精) ...
  • (最简单,详细,直接上手)uniapp/vue中英文多语言切换
  • .bat批处理(七):PC端从手机内复制文件到本地
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .NET I/O 学习笔记:对文件和目录进行解压缩操作
  • .NET 中让 Task 支持带超时的异步等待
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter