2010-09-13 2 views
18

У меня есть сайт ASP.Net (это MVC, но это не имеет значения здесь) с несколькими страницами, которые я хотел бы кэшировать очень хорошо.Настройка оптимальных заголовков кэширования HTTP и параметров сервера в ASP.Net MVC и IIS 7.5

В частности, я хотел бы достичь:

  1. выхода кэшированного на сервере в течение 2-х часов.
  2. если содержимое файла на сервера изменяется, то выходной кэш должен быть очищен для этой страницы
  3. кэшируются браузером в течение 10 минут (то есть даже не спрашивать сервер, если это то, что свежий)
  4. когда браузер делает фактический последующий запрос, я бы хотел, чтобы он использовал etags, чтобы сервер мог вернуть 304, если не был изменен.

(примечание - значения времени выше, являются только примерами ориентировочные)

  • 1) и 2) можно достичь с помощью Response.Cache.SetCacheability (HttpCacheability.Server)
  • я знаю 3) может достигаются с помощью максимального возраста и контроля кеша: private
  • Я могу испускать etags с Response.Cache.SetETagFromFileDependencies();

, но я не могу получить все из этих вещей, чтобы работать вместе. Вот что у меня есть:

Response.Cache.SetCacheability(HttpCacheability.ServerAndPrivate); 
     Response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     Response.Cache.SetETagFromFileDependencies(); 
     Response.Cache.SetValidUntilExpires(true); 
     Response.Cache.SetMaxAge(TimeSpan.FromSeconds(60 * 10)); 

Является ли сценарий возможным? В частности:

  • Могут ли браузеры делать как 3), так и 4)? Когда Firefox выдает новый запрос после истечения срока его действия в локальном кеше, он действительно отправляет etag, на который сервер ответил ранее, но я получаю ответ 200.
  • установка переменных, как указано выше, где бы я установил продолжительность выходного кэширования?

Спасибо за любые советы!

+0

«Firefox ... действительно посылает этаг» - вы имеете в виду в * If-None-Match *? И в этом конкретном случае вы вручную генерировали ETag с помощью 'SetETagFromFileDependencies()'? – bzlm

+0

Правильно, да. – Nik

+0

После этого, как это было разрешено? И как именно это провалилось? – harpo

ответ

1

Я не уверен, что вы решили эту проблему еще (несколько месяцев спустя ...), но это должно быть должно быть.

SetMaxAge должен установить количество «гарантированного» свежего времени. Если вы дополнительно отправите ETag, вы удовлетворитесь 3 & 4. Требования 1 & 2 могут быть решены ортогонально любым используемым механизмом кеширования на стороне сервера: я никогда не использовал кеш-сервер ASP.NET, подобный этому, но это почти наверняка возможно.

Я бы удалил посторонние заголовки из ваших ответов, таких как SetRevalidation - зачем это нужно?

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

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