У меня есть некоторый код, работающий в ApiController (веб-API ASP.Net), который сам хочет сделать запрос 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 Unauthorized (я пытался установить Preauthenticate = true
в WebRequestHandler
, но статус код по-прежнему 401). То же самое верно, если я изменю пул приложений, чтобы он работал под моими собственными учетными данными.
Итак, есть ли что-то в запуске пула приложений под идентификатором NetworkService и виртуальным идентификатором AppPoolIdentity, что мешает им использовать кэширование на стороне клиента? Где вообще физически существует содержимое, кэшированное WebRequest
?