2

最近、Web サービスの応答の一部に HTTP キャッシュ ヘッダーを追加しましたが、これまでのところ、クライアント側では何もしていません。これらの応答の 1 つを次に示します。

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れ、 my のプロパティ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

私のヘッダーには何も問題がなかったことがわかりました。むしろ、問題は のデフォルトのキャッシング ポリシーが でHttpWebRequestないことでし HttpRequestCacheLevel.Defaultた。悪いと思います。

リクエストの初期化に次の行を追加することで、期待どおりのキャッシュ結果を確認できました。

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

これをさまざまな点でテストしているときに発生した別の問題は、応答全体を読み取らない限り (たとえば、GetResponseStream()の最後まで読み取ることによって) 応答がキャッシュされないことでした。これは、ありがたいことにドキュメントに記載されています。

リソースのコピーがキャッシュに追加されるのは、リソースの応答ストリームが取得され、ストリームの最後まで読み取られた場合のみです。

于 2012-09-27T16:49:23.503 に答える