2013-05-25 76 views
6

我想從一個ASP.NET Web Api操作中實現CacheControl頭(我意識到我可以使用其他庫,並在過濾器/處理程序中執行此操作,但希望先執行一些測試) 。ASP.NET Web API CacheControl

我下面從一本書,看起來像一個簡單的例子:

var response = Request.CreateResponse<IEnumerable<string>>(HttpStatusCode.OK,emails); 

response.Headers.CacheControl = new CacheControlHeaderValue(); 
response.Headers.CacheControl.MaxAge = TimeSpan.FromHours(1); 
response.Headers.CacheControl.MustRevalidate = false; 
response.Headers.CacheControl.Public = true; 

return response; 

這段代碼幾乎是相同的數字形式提供的計算器其他的答案。

但是,web api根本沒有設置緩存控制標題!有任何想法嗎?????

當我查看fiddler中的響應時,它看起來像下面這樣,因爲您可以將cache-control設置爲no-cache。

HTTP/1.1 200 OK 
Cache-Control: no-cache 
Pragma: no-cache 
Content-Type: application/json; charset=utf-8 
Expires: -1 
Server: Microsoft-IIS/7.5 
X-AspNet-Version: 4.0.30319 
X-MiniProfiler-Ids: ["b7bfde10-e8d3-455d-b40d-2f33eb285023"] 
X-Powered-By: ASP.NET 
Date: Sat, 25 May 2013 11:54:35 GMT 
Content-Length: 24 

我試圖改變的最大生存週期,mustrevalidate和公共價值都無濟於事......

+1

我只是檢查你的響應代碼...爲我工作。這似乎是問題在別處......在你的解決方案*(一些AOP過濾器?,屬性?)* –

+1

我同意Radim,你的代碼是好的。你有沒有安裝任何MessageHandlers? –

+1

你有沒有找到這個不工作的原因?我遇到了同樣的問題,試圖將webapi整合到遺留的MVC項目中。 – Chad

回答

-4

你正在尋找this Stack Overflow answer thread討論答案。

真正的問題是,ASP.Net Web API是一個架構性災難,具有可怕的設計和更可怕的文檔。但據我所知,它是唯一的一個庫(除WFC外,這是另一個極其糟糕的設計/架構),它忽略了微軟愚蠢的「將所有內容映射到文件擴展名」!要求並提供real REST API端點。

你會浪費很多時間來試圖找出那些只是普通的問題,比如不能混淆響應頭,但它比幾百個服務要好。

如果有人在那裏知道一個設計合理的庫,可以提供真正的REST端點和行爲,而不會花費我一條胳膊和兩條腿,我當然希望聽到它。

+1

你有沒有簽出[ServiceStack](https://servicestack.net/)? –

2

檢查您的請求管道,查看您是否有某些操作通過System.Web.HttpResponse對象(例如:HttpContext.Current.Response)響應。我遇到了通過System.Web.HttpResponse添加http cookie將清除Web API的System.Net.Http.HttpResponseMessage中定義的任何緩存控制標頭的情況。

儘量避免System.Web.HttpResponse。如果這是不可能的,one workaround as discussed here將通過AddHeader()手動設置cookie標頭,並完全避免Cookies集合。