C# 输出缓存方法 C# ASP.NET Core 8如何使用Output Caching

发布时间 - 2026-02-03 00:00:00    点击率:
ASP.NET Core 8 中 Output Caching 必须显式启用:需在 Program.cs 中调用 AddOutputCache() 注册服务并使用 UseOutputCache() 注册中间件,否则缓存完全不生效且无提示;[EnableOutputCaching] 比 [ResponseCache] 更强大,支持自定义键、查询参数区分等高级功能。

Output Caching 在 ASP.NET Core 8 中必须显式启用

ASP.NET Core 8 默认不启用 Output Caching,即使你加了 [ResponseCache][EnableOutputCaching],请求也不会被缓存——因为底层服务根本没注册。必须在 Program.cs 中调用 AddOutputCache() 并配置中间件。

  • 漏掉 builder.Services.Add

    OutputCache()
    → 缓存完全不生效,且无任何警告或错误
  • 漏掉 app.UseOutputCache() → 中间件链断开,缓存策略被跳过
  • 若同时用了 UseResponseCaching()(旧版 API),需彻底移除,它与 Output Caching 冲突

控制器方法上启用缓存的两种等效写法

推荐直接使用 [EnableOutputCaching] 特性,它比旧的 [ResponseCache] 更精确、支持更多策略(如基于查询参数或自定义键的缓存)。

  • [EnableOutputCaching]:启用默认策略(60 秒,响应体全量缓存)
  • [EnableOutputCaching(Duration = 300)]:指定 5 分钟缓存时间
  • [EnableOutputCaching(PolicyName = "MyPolicy")]:引用命名策略(适合复用或集中管理)
  • [ResponseCache] 仍能工作,但仅触发基础 HTTP 缓存头(Cache-Control),不走内存/分布式缓存后端,也不支持键变换等高级功能

缓存键生成逻辑容易被忽略的细节

Output Caching 默认按 HTTP 方法 + 请求路径 + 查询字符串 + 请求头(如 AcceptAccept-Encoding)生成缓存键。这意味着:

  • 带不同查询参数的请求(如 /api/items?id=1/api/items?id=2)默认视为不同缓存项
  • 客户端发来 Accept: application/jsonAccept: text/plain 会分别缓存
  • 若想忽略某些查询参数(如跟踪用的 utm_source),需自定义策略:policy.AddBasePolicy(builder => builder.Expire(TimeSpan.FromMinutes(10)).VaryByQuery("id"))
  • 不建议用 VaryByAll,它会让每个请求都生成新缓存项,等于没缓存

调试缓存是否生效的关键信号

光看响应头不够,要确认缓存真正命中。最直接的方式是观察日志和响应头组合:

  • 启用日志:在 appsettings.Development.json 中设置 "Microsoft.AspNetCore.OutputCaching": "Information"
  • 命中缓存时,日志中会出现 Cache hit for key 'xxx';未命中则为 Cache miss
  • 响应头中出现 X-Output-Cache: Hit(或 Miss)是 Output Caching 的专属标识,比 AgeCache-Control 更可靠
  • 注意:POST/PUT 等非安全方法默认不缓存,即使加了特性也无效——这是设计限制,不是 bug
缓存策略的粒度控制(比如按用户 ID 分离缓存)和跨服务共享缓存(如 Redis 后端)需要额外配置,这些地方一旦设错,表现往往是“看起来缓存了,但数据总是旧的”或者“不同用户看到彼此的缓存结果”。


# redis  # js  # json  # seo  # app  # 后端  # ai  # microsoft  # c#  # .net  # red  # 分布式  # 中间件  # for  # 字符串  # http  # bug  # 自定义  # 这是  # 也不  # 两种  # 用了  # 会让  # 无任何  # 不走  # 则为 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  Android自定义listview布局实现上拉加载下拉刷新功能  详解jQuery中基本的动画方法  Laravel队列任务超时怎么办_Laravel Queue Timeout设置详解  Laravel如何实现多对多模型关联?(Eloquent教程)  Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Laravel怎么实现搜索高亮功能_Laravel结合Scout与Algolia全文检索【实战】  免费视频制作网站,更新又快又好的免费电影网站?  Laravel如何使用查询构建器?(Query Builder高级用法)  在centOS 7安装mysql 5.7的详细教程  Laravel如何使用Blade组件和插槽?(Component代码示例)  java获取注册ip实例  Laravel如何升级到最新的版本_Laravel版本升级流程与兼容性处理  如何快速搭建高效简练网站?  Laravel如何处理表单验证?(Requests代码示例)  如何快速重置建站主机并恢复默认配置?  郑州企业网站制作公司,郑州招聘网站有哪些?  高端云建站费用究竟需要多少预算?  绝密ChatGPT指令:手把手教你生成HR无法拒绝的求职信  jquery插件bootstrapValidator表单验证详解  iOS中将个别页面强制横屏其他页面竖屏  php嵌入式断网后怎么恢复_php检测网络重连并恢复硬件控制【操作】  如何用JavaScript实现文本编辑器_光标和选区怎么处理  Laravel如何使用Eloquent ORM进行数据库操作?(CRUD示例)  进行网站优化必须要坚持的四大原则  Win11怎么关闭专注助手 Win11关闭免打扰模式设置【操作】  网站制作报价单模板图片,小松挖机官方网站报价?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  Laravel DB事务怎么使用_Laravel数据库事务回滚操作  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  Laravel如何将应用部署到生产服务器_Laravel生产环境部署流程  制作旅游网站html,怎样注册旅游网站?  Laravel storage目录权限问题_Laravel文件写入权限设置  JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  如何续费美橙建站之星域名及服务?  微博html5版本怎么弄发超话_超话进入入口及发帖格式要求【教程】  如何在万网自助建站平台快速创建网站?  如何快速搭建支持数据库操作的智能建站平台?  node.js报错:Cannot find module 'ejs'的解决办法  如何快速搭建高效香港服务器网站?  如何将凡科建站内容保存为本地文件?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  Laravel如何发送邮件_Laravel Mailables构建与发送邮件的简明教程  Android仿QQ列表左滑删除操作  再谈Python中的字符串与字符编码(推荐)  如何用AI帮你把自己的生活经历写成一个有趣的故事?  HTML5打空格有哪些误区_新手常犯的空格使用错误【技巧】  JavaScript如何实现类型判断_typeof和instanceof有什么区别