2012-03-29 5 views
6

私はApiController(ASP.Net Web API)内でいくつかのコードを実行しており、それ自体が別のWebサービスに対してGET要求を出したいと思っています。 Webサービス(私のアプリケーションの一部でもある)は、返すコンテンツの有効期限を示すCache-Controlヘッダを返します。WebRequest.CachePolicyはIIS内で動作するコードから動作する必要がありますか?

私は(それはその基礎となるHTTP実装としてSystem.Net.WebRequestを使用していますが、デフォルトHttpClientHandlerは、キャッシュの設定をサポートしていません)クライアント側のキャッシュを使用するためにWebRequestHandlerで構成された、新しいSystem.Net.Http.HttpClientを使用しています:

var client = new HttpClient(new WebRequestHandler { 
    UseDefaultCredentials = true, 
    CachePolicy = new RequestCachePolicy(RequestCacheLevel.Default) 
}); 
var response = client.GetAsync("someUri").Result; 
response.EnsureSuccessStatusCode(); 
(省略)上記のコードは、テスト中に正常に動作する

var response = new HttpResponseMessage(HttpStatusCode.OK); 
response.Headers.CacheControl = new CacheControlHeaderValue { 
    Public = true, 
    MaxAge = new TimeSpan(0, 5, 0); // Five minutes in this case 
}; 

// Omitted, some content is added to the response 
return response; 

...を経て、私は私のコントローラのアクション内キャッシュを有効にしていますサーバー上

。私はこのようにして複数の呼び出しを行い、最初の呼び出しだけが実際にサービスに接続します(IISのサービス上のログメッセージを介して観察されます)。後続の呼び出しはキャッシュを使用します。

しかし、IIS自体でホストされている同じコードを実行していると、HttpClientはキャッシュ結果を無視しているようです(私は、のインスタンスがAppDomainに1つだけ存在するようにIoCコンテナを設定しました)時間。これはAppPoolIdentityとして実行されています。私はNetworkServiceのように実行するアプリケーションプールを変更した場合

は興味深いことに、その後、応答が(私はWebRequestHandlerPreauthenticate = trueを設定しようとしたが、ステータスコードはまだ401です)不正なステータスコード401を持っています。私が自分の資格情報で実行するようにアプリケーションプールを変更する場合も同じです。

したがって、NetworkService IDでアプリケーションプールを実行し、クライアント側のキャッシュを使用できないようにする仮想AppPoolIdentityがありますか。とにかくWebRequestによってキャッシュされたコンテンツは物理的にどこに存在しますか?

+0

から、次のサポート記事をチェックしてくださいあなたはあなたの問題を販売していましたか?私はまったく同じ問題を抱えています。 – Chad

+0

Nopeは問題を解決しなかったので、私の解決策を再構築して回避しました。 –

答えて

0

IISでキャッシュが機能しない理由はありません。キャッシュはWinINetProxyによって実装され、Internet Explorerで使用されるのと同じキャッシュです。

有効期限の代わりにmax-ageを設定してみてください。

+0

私は実際にmax-ageを設定しています。上記の私の例を更新しました。 –

関連する問題