Установка оптимальных заголовков кэширования http и параметров сервера в ASP.Net MVC и IIS 7.5 - PullRequest
18 голосов
/ 14 сентября 2010

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

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

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

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

  • 1) и 2) я могу добиться с помощью Response.Cache.SetCacheability (HttpCacheability.Server)
  • Я знаю, 3) может быть достигнуто с помощью max-age и cache-control: 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.
  • установка переменных, как указано выше, где бы я установил продолжительность кэширования вывода?

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

1 Ответ

1 голос
/ 31 января 2011

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

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

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

...