2012-01-24 4 views
6

WCF Web APIで簡単なRESTサービスを実装しており、レスポンスをキャッシュするためにHTTPヘッダーを設定しようとしています。WCF Web APIのHTTPキャッシュがブラウザ間で矛盾しているようです

この

http://localhost:49302/my/2 

のような単純なGETのレスポンスヘッダは次のようになります。

Server: ASP.NET Development Server/10.0.0.0 
Date: Tue, 24 Jan 2012 18:18:44 GMT 
X-AspNet-Version: 4.0.30319 
Content-Length: 233 
Cache-Control: max-age=120 
Vary: Accept 
Expires: Tue, 24 Jan 2012 18:20:44 GMT 
Last-Modified: Tue, 24 Jan 2012 18:18:15 GMT 
Content-Type: application/xml; charset=utf-8 

目的は、クライアントが2分のリソースをキャッシュするべきであるということです。

しかし、行動はさまざまなブラウザ間で矛盾している、WCFのWeb APIテストクライアントを使用して:

  • Firefoxでは(9.0.1)要求がキャッシュされ、そして最初の2分後の新しいバージョンですリソースが表示されます。この動作は期待どおりです。
  • Chrome(16.0.912.77 m)では、キャッシュヘッダーはまったく尊重されません。すべてのGET要求に対して、新しいバージョンのリソースがフェッチされています。この動作は(少なくとも、私には)期待されていません。
  • Internet Explorer(9)では、Chromeと同じ動作になります。

なぜChromeとIEはキャッシュヘッダーを尊重しないのですか?

WCF Web APIテストクライアントのバグですか?

+1

WCF Web APIテストクライアントは非常に新しいので、バグがある可能性があります。ブラウザーで直接テストしたり、小さなテストページを書くことはできますか? – suing

答えて

4

キャッシュを正しく取得することは難しいです。ブラウザがキャッシュ・ディレクティブを無視することは、確かに役に立ちません。私は15秒のキャッシュ期間でこれをテストし、それはそう私はちょうどMaxAgeのとMustRevalidate設定した場合

this document IEによると、ヘッダ含む何も異なりますが、受け入れエンコードおよびユーザー・エージェント

持つすべての要求をキャッシュされませんIE9、FireFox、Chromeでうまく動作します。

のWeb APIのHttpResponseMessage:

result = new HttpResponseMessage<Book>(book); 
result.Headers.CacheControl = new CacheControlHeaderValue(); 
result.Headers.CacheControl.MaxAge = TimeSpan.FromSeconds(15); 
result.Headers.CacheControl.MustRevalidate = true; 
return result; 

レスポンスヘッダ:

HTTP/1.1 200 OK 
Server: ASP.NET Development Server/10.0.0.0 
Date: Wed, 25 Jan 2012 09:13:32 GMT 
X-AspNet-Version: 4.0.30319 
Content-Length: 98 
Cache-Control: must-revalidate, max-age=15 
Content-Type: application/json; charset=utf-8 
Connection: Close 

私はMustRevalidateが本当に必要とされるかわからないが、それを使用することをお勧めします。仕様hereを参照してください。

+0

キャッシュディレクティブを無視しているブラウザについてはかなり興味深い見通しです。しかし、ここに投稿されたものに非常に近くなるようにヘッダーを整えたとしても、まだChromeまたはIE9がその応答をキャッシュしているのを見ていません。 –

+0

キャッシュ・ディレクティブは単なるヒントであり、ブラウザはそれを無視することができます。must-revalidateを使用することは、ブラウザがより厳しくなることを示すヒントです。私はlocalhostでテストしていましたが、テストクライアントを使用しませんでしたが、jQuery $ .getJSON()コールで通常のHTMLページのボタンを使用しました。 – Maurice

2

localhostを "real domain"に置き換えるようにテストしてください.WCFテストクライアントまたはChrome/IEではlocalhostの特別なトリックはありません。

+0

それは私がそれについて考えていなかったので、実際にはかなり合理的な提案でしたが、うーん、それは違いはありません。私はまだ私のローカルボックスで動作していますが、ローカルマシン名(NETBIOS)と「完全修飾DNS」の両方の名前で試してみました。 –

関連する問題