HTTP-кэширование в WCF Web API кажется несовместимым во всех браузерах - PullRequest
6 голосов
/ 24 января 2012

Я реализую простую службу 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 не учитывают заголовки кэша?

Это ошибка в тестовом клиенте WCF Web API?

Ответы [ 2 ]

4 голосов
/ 25 января 2012

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

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

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

Web 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 действительно требуется, но его рекомендуется использовать.Смотрите спецификации здесь .

2 голосов
/ 25 января 2012

Тест для замены localhost на «реальный домен», чтобы в тестовом клиенте WCF или Chrome / IE не было специальных приемов для localhost.

...