Должен ли WebRequest.CachePolicy работать из кода, работающего в IIS?

У меня есть некоторый код, работающий в 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?

6
задан Cheeso 2 May 2012 в 17:24
поделиться