6

ApiController(ASP.Net Web API)内で実行されているコードがあり、それ自体が別のWebサービスに対してGET要求を行います。Webサービス(これも私のアプリの一部)は、返すコンテンツの有効期限を示すCache-Controlヘッダーを返します。

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

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コンテナーも設定しましHttpClientた)、毎回サービスを呼び出すようです。これはAppPoolIdentityとして実行されています。

興味深いことに、ネットワークサービスとして実行するようにアプリプールを変更すると、応答のステータスコードは401 Unauthorizedになります(設定を試みPreauthenticate = trueましたWebRequestHandlerが、ステータスコードはまだ401です)。自分の資格情報で実行するようにアプリプールを変更した場合も同じです。

それで、NetworkServiceIDと仮想AppPoolIdentityの下でAppPoolを実行することについて、クライアント側のキャッシュを使用できないようにする何かがありますか。WebRequestとにかく、物理的 にキャッシュされたコンテンツはどこに存在しますか?

4

2 に答える 2

2

IISで実行している場合、WinInetキャッシングはサポートされていません。MShttp://support.microsoft.com/kb/238425の次のサポート記事を確認してください。

于 2015-03-06T04:57:39.887 に答える
0

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

有効期限の代わりに最大年齢を設定してみてください。

于 2012-03-30T12:25:56.040 に答える