2

我最近在我的一些 Web 服务响应中添加了一些 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 的说法,这个响应应该是完全可缓存的。这是提琴手所说的:

public:这个响应可以被任何缓存缓存。
max-age:此资源将在 1 分钟后过期。[60 秒]

即便如此,响应也不是来自缓存:我在 Fiddler 中看到它们并且IsFromCache我的属性HttpWebResponsefalse。这是我请求的内容,fwiw:

GET http://floater/rest/folders/folder.20 HTTP/1.1
Accept: application/vnd.com....
Authorization: Basic blahblah
Host: floater

我错过了什么?

4

1 回答 1

1

事实证明,我的标题没有任何问题。相反,问题在于HttpWebRequestis not HttpRequestCacheLevel.Default的默认缓存策略。我的错,我猜。

通过将以下行添加到我的请求初始化中,我能够看到我期望的缓存结果:

webRequest.CachePolicy = new HttpRequestCachePolicy(HttpRequestCacheLevel.Default);

我在各个方面对此进行测试时遇到的另一个问题是,除非您阅读整个响应(例如,通过读取到GetResponseStream()的末尾),否则不会缓存响应。值得庆幸的是,文档中指出了这一点:

仅当资源的响应流被检索并读取到流的末尾时,才会将资源的副本添加到缓存中。

于 2012-09-27T16:49:23.503 回答