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 方法 + 请求路径 + 查询字符串 + 请求头(如 Accept、Accept-Encoding)生成缓存键。这意味着:
- 带不同查询参数的请求(如
/api/items?id=1和/api/items?id=2)默认视为不同缓存项 - 客户端发来
Accept: application/json和Accept: 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 的专属标识,比Age或Cache-Control更可靠 - 注意:POST/PUT 等非安全方法默认不缓存,即使加了特性也无效——这是设计限制,不是 bug
# 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有什么区别


