ASP.NET Core响应缓存疑问:为何需配置app.UseResponseCaching()
问题解答
核心认知先理清
[ResponseCache]特性本身不实现任何缓存存储逻辑,它的唯一作用是按照配置给HTTP响应生成对应的缓存相关响应头,你现在能看到正确的cache-control头,就是这个特性正常工作的表现,和缓存实际有没有生效没有直接关系。app.UseResponseCaching()是ASP.NET Core提供的服务端输出缓存中间件,它运行在服务端,会根据响应携带的缓存规则把响应内容存在服务端内存中,后续匹配规则的请求会直接从服务端缓存返回、不用执行接口逻辑。你之前感知到的“缓存生效”是服务端缓存的效果,和浏览器本地缓存完全无关,这类响应一般会带Age响应头,可以用来区分是否是服务端缓存返回的内容。
为什么浏览器没有按规则存储/使用本地缓存
这类问题基本都是踩了浏览器缓存策略的默认规则坑,和ASP.NET Core的配置无关,常见原因如下:
- 请求方法不符合缓存要求
所有浏览器默认只会缓存GET、HEAD两类请求的响应,如果你测试的接口是POST/PUT/DELETE等其他请求方法,哪怕响应头配置完全正确,浏览器也不会存储响应内容。 - 触发请求的操作本身就会跳过本地缓存
很多人测试的时候习惯按F5刷新页面验证缓存,这个操作本身就会让浏览器主动发起请求校验资源,不会直接读取未过期的本地缓存:- 地址栏回车访问、点击前进/后退按钮、从书签进入:浏览器会优先检查本地缓存,未过期时直接使用本地缓存、不发请求
- 按F5普通刷新:浏览器无论缓存是否过期,都会携带协商缓存头(
If-None-Match/If-Modified-Since)发起请求,服务端返回304时才会复用本地缓存 - 按Ctrl+F5强刷:浏览器会完全跳过本地缓存,携带强制拉取新资源的请求头获取最新内容
- 响应携带了阻止缓存的其他头
检查接口返回的完整响应头,如果存在以下情况,浏览器也不会缓存响应:- 响应带了
Set-Cookie头,且缓存规则没有显式声明允许缓存带Cookie的响应 - 响应带了
Pragma: no-cache、或者Expires头的时间早于当前时间,这类头会覆盖cache-control的配置 - 响应使用分块传输编码(
Transfer-Encoding: chunked)且没有返回明确的Content-Length头,部分浏览器会拒绝缓存这类响应
- 响应带了
- 请求带了特殊头触发浏览器严格缓存策略
如果接口请求默认携带了Authorization认证头,部分旧版本浏览器会采用更严格的缓存校验规则,不会直接使用未过期的本地缓存。
验证本地缓存是否正常的正确方式
- 先清空浏览器当前站点的所有缓存数据,关闭开发者工具的网络面板(避免开发工具的网络策略干扰)
- 第一次通过地址栏回车访问接口地址,确认响应头正确
- 关闭当前标签页,重新在地址栏输入接口地址回车访问
- 打开开发者工具看网络面板,如果对应请求的状态码显示
200 (from disk cache)或者200 (from memory cache),就说明浏览器本地缓存已经正常工作。
内容的提问来源于stack exchange,提问作者X.Otano
相关产品推荐
相关产品推荐

