У меня есть код, работающий в ApiController (ASP.Net Web API), который сам хочет сделать запрос GET к другому веб-сервису.Веб-служба (также часть моего приложения) возвращает заголовки Cache-Control, указывающие время истечения для возвращаемого содержимого.
Я использую новый System.Net.Http.HttpClient
, настроенный с WebRequestHandler
для использованияКэширование на стороне клиента (по умолчанию HttpClientHandler
не поддерживает настройку кеша, хотя он использует System.Net.WebRequest
в качестве своей базовой реализации HTTP):
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
игнорирует результат кэширования (я также настроил свой контейнер IoC таким образом, чтобы только один экземпляр HttpClient
существует в AppDomain) и вызывает сервис каждый раз.Это работает как AppPoolIdentity.
Интересно, что если я изменю пул приложений для запуска в качестве NetworkService, ответ получит код состояния 401 Несанкционированный (я пытался установить Preauthenticate = true
на WebRequestHandler
, но код состояния по-прежнему 401).То же самое верно, если я изменю пул приложений для запуска под своими собственными учетными данными.
Итак, есть ли что-то в запуске пула приложений под идентификатором NetworkService и виртуальным AppPoolIdentity, который не позволяет им использовать клиентскую частькэширование.Где в любом случае физически существует контент, кэшированный WebRequest
?