HTTP-кеширование в веб-API WCF кажется непоследовательным в браузерах

Я реализую простой сервис REST с WCF Web API и пытаюсь установить заголовки HTTP для кэширования ответов.

Для простого GET, подобного этому

http://localhost:49302/my/2

заголовки ответов выглядят следующим образом:

Server: ASP.NET Development Server/10.0.0.0
Date: Tue, 24 Jan 2012 18:18:44 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 233
Cache-Control: max-age=120
Vary: Accept
Expires: Tue, 24 Jan 2012 18:20:44 GMT
Last-Modified: Tue, 24 Jan 2012 18:18:15 GMT
Content-Type: application/xml; charset=utf-8

Предполагается, что клиент должен кэшировать ресурс в течение двух минут.

Однако, используя тестовый клиент WCF Web API, поведение несовместимо в разных браузерах:

  • В Firefox (9.0.1) запрос кэшируется, и сначала через две минуты отображается новая версия отображаемого ресурса. Такое поведение, как и ожидалось.
  • В Chrome (16.0.912.77 м) заголовки кеша не соблюдаются вообще. Новая версия ресурса выбирается для каждого запроса GET. Такое поведение не ожидается (по крайней мере, мне).
  • В Internet Explorer (9) поведение такое же, как в Chrome.

Почему Chrome и IE не относятся к заголовкам кеша?

Является ли это ошибкой в ​​тестовом клиенте веб-API WCF?

6
24 янв. '12 в 21:43
источник поделиться
2 ответов

Кэшировать сложно. Тот факт, что браузер может игнорировать директивы кэша, конечно, не помогает.

В соответствии с этот документ IE никогда не кэшировал какой-либо запрос с заголовком Vary, содержащим ничего, кроме Accept-Encoding и User-Agent

Если я тестирую это с периодом кеширования 15 секунд, и я просто устанавливаю MaxAge и MustRevalidate, похоже, что он отлично работает с IE9, FireFox и Chrome.

Веб-API HttpResponseMessage:

result = new HttpResponseMessage<Book>(book);
result.Headers.CacheControl = new CacheControlHeaderValue();
result.Headers.CacheControl.MaxAge = TimeSpan.FromSeconds(15);
result.Headers.CacheControl.MustRevalidate = true;
return result;

Заголовки ответов:

HTTP/1.1 200 OK
Server: ASP.NET Development Server/10.0.0.0
Date: Wed, 25 Jan 2012 09:13:32 GMT
X-AspNet-Version: 4.0.30319
Content-Length: 98
Cache-Control: must-revalidate, max-age=15
Content-Type: application/json; charset=utf-8
Connection: Close

Я не уверен, что MustRevalidate действительно требуется, но рекомендуется его использовать. См. Спецификации здесь.

4
25 янв. '12 в 12:30
источник

Тест для замены localhost на "настоящий домен", поэтому тестовый клиент WCF или Chrome/IE не имеет специальных трюков для localhost.

2
24 янв. '12 в 23:52
источник

Посмотрите другие вопросы по меткам или Задайте вопрос