2012-01-24 19 views
6

我正在實現一個簡單的REST服務,使用WCF Web API並嘗試設置HTTP頭以緩存響應。WCF Web API中的HTTP緩存在瀏覽器中似乎不一致

對於一個簡單的得到這樣

http://localhost:49302/my/2 

響應標題是這樣的:

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 

這樣做的目的是,客戶端應該緩存的資源兩分鐘。

然而,使用WCF的Web API測試客戶端,該行爲在不同的瀏覽器不一致:前兩分鐘後

  • 在Firefox(9.0.1)的請求被高速緩存,是新版本顯示的資源。這種行爲如預期的那樣。
  • 在Chrome(16.0.912.77米)中,根本不考慮緩存標頭。每個GET請求都會獲取新版本的資源。這種行爲是沒有預料到的(至少我是這樣)。
  • 在Internet Explorer(9)中,行爲與Chrome中的行爲相同。

爲什麼Chrome和IE不尊重緩存頭?

它是WCF Web API測試客戶端中的錯誤嗎?

+1

WCF Web API測試客戶端非常新,所以它可能有一個錯誤。你能直接用瀏覽器測試還是寫一個小測試頁。 – suing

回答

4

緩存很難找對。瀏覽器可能會忽略緩存指令的事實當然無濟於事。

根據this document IE永遠不會緩存與因人而異包含什麼頭,但Accept-Encoding和用戶代理

任何請求。如果我測試這與15秒緩存時段,我只是設置最大生存週期和MustRevalidate似乎與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

結果緩存指令只是一個提示,瀏覽器可以自由地忽略它。使用必須重新驗證是一個提示瀏覽器更嚴格,不知道有什麼不同。我在本地主機上測試,並沒有使用測試客戶端,而是使用jQuery $ .getJSON()調用在常規HTML頁面上使用按鈕。 – Maurice

2

測試用「真實域」替換本地主機,所以WCF測試客戶端或Chrome/IE對本地主機沒有任何特殊技巧。

+0

這實際上是一個非常合理的建議,因爲我沒有想過這件事,但唉,它沒有什麼區別。儘管如此,我仍然在我的本地機器上運行,但我已經嘗試使用本地計算機名稱(NETBIOS)以及「完全限定」類似DNS的名稱。 –