2013-05-25 10 views
6

私は(私は他のライブラリを使用して、およびフィルタ/ハンドラでこれを行うことができます実現しますが、最初のいくつかのテストをしたい)ASP.NETウェブAPIアクション内からCacheControlヘッダを実装しようとしています。ASP.NETのWeb API CacheControl

私は次のようになり帳から簡単な例を以下しています:このコードはstackoverflowの上で提供される他の回答数とほぼ同じです

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はキャッシュコントロールヘッダーをまったく設定していません。何か案は?????

フィドラーでレスポンスを見ると、cache-controlがno-cacheに設定できるので、次のようになります。私はすべて無駄にMAXAGE、mustrevalidateや公共の値を変更しようとしている

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 

...

+1

あなたのレスポンスコードを確認してください...私のために働いています。あなたの解決策*(いくつかのAOPフィルタ?、属性?)* –

+1

私はRadimに同意します、あなたのコードは問題ありません。 MessageHandlerはインストールされていますか? –

+1

これがうまくいかない理由が見つかりましたか?私はwebapiを従来のMVCプロジェクトに統合しようとしているのと同じ問題にぶつかっています。 – Chad

答えて

-4

あなたはthis Stack Overflow answer threadで議論されて探している答え。

本当の問題は、ASP.NetのWeb APIは恐ろしいデザイン、さらに恐ろしいのドキュメントで、建築の災害であるということです。しかし、限り、私はそれが唯一のライブラリ(WFCを除いて、他の深刻な設計/アーキテクチャではありません)を黙って "ファイルの拡張子にすべてのマップを無視することがわかります!また、 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を避けてください。これが不可能な場合は、を使用して手動でクッキーヘッダーを設定し、Cookiesの収集を完全に避けることが、one workaround as discussed hereです。