2012-03-29 8 views
6

У меня есть код, запущенный в 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?

+0

ли вы когда-нибудь продали проблему? У меня такая же проблема. – Chad

+0

Nope не решила проблему, вызвала мое решение, чтобы обойти его. –

ответ

0

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

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

+0

Я устанавливаю max-age на самом деле; обновили мой пример выше. –

 Смежные вопросы

  • Нет связанных вопросов^_^