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 】
相关推荐:
武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?
如何确认建站备案号应放置的具体位置?
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
如何快速完成中国万网建站详细流程?
Laravel如何实现事件和监听器?(Event & Listener实战)
如何用景安虚拟主机手机版绑定域名建站?
Laravel如何使用Gate和Policy进行权限控制_Laravel权限判定与策略规则配置
手机怎么制作网站教程步骤,手机怎么做自己的网页链接?
Laravel怎么创建自己的包(Package)_Laravel扩展包开发入门到发布
作用域操作符会触发自动加载吗_php类自动加载机制与::调用【教程】
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
怎么用AI帮你设计一套个性化的手机App图标?
高性能网站服务器配置指南:安全稳定与高效建站核心方案
如何做网站制作流程,*游戏网站怎么搭建?
Laravel如何创建自定义中间件?(Middleware代码示例)
Laravel如何生成URL和重定向?(路由助手函数)
Laravel如何使用集合(Collections)进行数据处理_Laravel Collection常用方法与技巧
如何在橙子建站上传落地页?操作指南详解
如何在VPS电脑上快速搭建网站?
长沙企业网站制作哪家好,长沙水业集团官方网站?
Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)
javascript中的数组方法有哪些_如何利用数组方法简化数据处理
Python自动化办公教程_ExcelWordPDF批量处理案例
如何快速查询域名建站关键信息?
LinuxShell函数封装方法_脚本复用设计思路【教程】
Laravel如何实现数据库事务?(DB Facade示例)
Laravel如何保护应用免受CSRF攻击?(原理和示例)
PHP的CURL方法curl_setopt()函数案例介绍(抓取网页,POST数据)
PHP正则匹配日期和时间(时间戳转换)的实例代码
如何在 React 中条件性地遍历数组并渲染元素
Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用
详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点
Laravel怎么调用外部API_Laravel Http Client客户端使用
ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集
Internet Explorer官网直接进入 IE浏览器在线体验版网址
网站建设保证美观性,需要考虑的几点问题!
制作电商网页,电商供应链怎么做?
高端网站建设与定制开发一站式解决方案 中企动力
Laravel如何使用Gate和Policy进行授权?(权限控制)
JavaScript如何实现路由_前端路由原理是什么
laravel怎么配置Redis作为缓存驱动_laravel Redis缓存配置教程
制作旅游网站html,怎样注册旅游网站?
,网页ppt怎么弄成自己的ppt?
Laravel如何与Docker(Sail)协同开发?(环境搭建教程)
JavaScript如何实现继承_有哪些常用方法
简历没回改:利用AI润色让你的文字更专业
Laravel怎么做缓存_Laravel Cache系统提升应用速度的策略与技巧
CSS3怎么给轮播图加过渡动画_transition加transform实现【技巧】
文字头像制作网站推荐软件,醒图能自动配文字吗?
如何快速查询网址的建站时间与历史轨迹?


