我最近在我的一些网络服务响应中添加了一些HTTP缓存标头,但到目前为止他们还没有为我在客户端做任何事情。以下是其中一个回复:
HTTP/1.1 200 OK
Cache-Control: public, max-age=60
Transfer-Encoding: chunked
Content-Type: application/vnd.com...
Expires: Thu, 27 Sep 2012 03:40:27 GMT
Server: Microsoft-IIS/7.5
Set-Cookie: DDRSSID=...
X-DDVS-Version: 1.0.0.0
X-Powered-By: ASP.NET
Date: Thu, 27 Sep 2012 03:40:22 GMT
根据Fiddler和REDbot的说法,这个响应应该是完全可缓存的。这就是Fiddler所说的:
public:任何缓存都可以缓存此响应 max-age:此资源将在1分钟后过期。 [60秒]
即便如此,回复并非来自缓存:我在Fiddler中看到它们,而IsFromCache
上的HttpWebResponse
属性为 false 。这是我的请求的内容,fwiw:
GET http://floater/rest/folders/folder.20 HTTP/1.1
Accept: application/vnd.com....
Authorization: Basic blahblah
Host: floater
我错过了什么?
答案 0 :(得分:1)
事实证明我的标题没有任何问题。相反,问题是HttpWebRequest
的默认缓存策略是而不是 HttpRequestCacheLevel.Default
。我猜不好。
通过在我的请求初始化中添加以下行,我能够看到我期望的缓存结果:
webRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);
我在各方面测试时遇到的另一个问题是,除非您阅读整个响应(例如,通过阅读GetResponseStream()的末尾),否则不会缓存响应。值得庆幸的是,文档中提到了这一点:
如果检索到资源的响应流并将其读取到流的末尾,则只会将资源的副本添加到缓存中。