Должен ли WebRequest.CachePolicy работать из кода, работающего в IIS? - PullRequest
6 голосов
/ 29 марта 2012

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

Ответы [ 2 ]

2 голосов
/ 06 марта 2015

Кеширование WinInet не поддерживается при работе на IIS, пожалуйста, проверьте следующую статью поддержки от MS http://support.microsoft.com/kb/238425

0 голосов
/ 30 марта 2012

Я не вижу причин, почему кеш не должен работать под IIS.Кэш реализован WinINetProxy и является тем же кешем, который используется Internet Explorer.

Попробуйте установить максимальный возраст вместо времени истечения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...