У меня есть код, запущенный в ApiController (ASP.Net Web API), который сам хочет сделать запрос GET другому веб-сервису. Веб-служба (также часть моего приложения) возвращает заголовки Cache-Control, указывающие время истечения срока действия возвращаемого содержимого.Должен ли WebRequest.CachePolicy работать с кодом, запущенным в IIS?
Я использую новый 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
?
ли вы когда-нибудь продали проблему? У меня такая же проблема. – Chad
Nope не решила проблему, вызвала мое решение, чтобы обойти его. –