ApiController(ASP.Net Web API)内で実行されているコードがあり、それ自体が別のWebサービスに対してGET要求を行います。Webサービス(これも私のアプリの一部)は、返すコンテンツの有効期限を示すCache-Controlヘッダーを返します。
クライアント側のキャッシュを使用するためにSystem.Net.Http.HttpClient
で構成された新しいを使用しています(デフォルトでは、基になるHTTP実装として使用されますが、キャッシュ構成はサポートされていません)。WebRequestHandler
HttpClientHandler
System.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
とにかく、物理的 にキャッシュされたコンテンツはどこに存在しますか?