私は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のように実行するアプリケーションプールを変更した場合
は興味深いことに、その後、応答が(私はWebRequestHandler
にPreauthenticate = true
を設定しようとしたが、ステータスコードはまだ401です)不正なステータスコード401を持っています。私が自分の資格情報で実行するようにアプリケーションプールを変更する場合も同じです。
したがって、NetworkService IDでアプリケーションプールを実行し、クライアント側のキャッシュを使用できないようにする仮想AppPoolIdentityがありますか。とにかくWebRequest
によってキャッシュされたコンテンツは物理的にどこに存在しますか?
から、次のサポート記事をチェックしてくださいあなたはあなたの問題を販売していましたか?私はまったく同じ問題を抱えています。 – Chad
Nopeは問題を解決しなかったので、私の解決策を再構築して回避しました。 –