Заголовки Cache-Control в ASP.NET - PullRequest
27 голосов
/ 03 июня 2009

Я пытаюсь установить заголовки управления кэшем для веб-приложения (и, похоже, я могу это сделать), но я получаю, как мне кажется, странные записи в ответах заголовка. Моя реализация выглядит следующим образом:

    protected override void OnLoad(EventArgs e)
    {
        // Set Cacheability...
        DateTime dt = DateTime.Now.AddMinutes(30);
        Response.Cache.SetExpires(dt);
        Response.Cache.SetMaxAge(new TimeSpan(dt.ToFileTime()));

        // Complete OnLoad...
        base.OnLoad(e);
    }

И вот что показывают ответы в заголовке:

-----
GET /Pages/Login.aspx HTTP/1.1
Host: localhost:1974
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.10) Gecko/2009042316 Firefox/3.0.10 (.NET CLR 3.5.30729)
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-us,en;q=0.5
Accept-Encoding: gzip,deflate
Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive: 300
Connection: keep-alive
X-lori-time-1: 1244048076221
Cache-Control: max-age=0

HTTP/1.x 200 OK
Server: ASP.NET Development Server/8.0.0.0
Date: Wed, 03 Jun 2009 16:54:36 GMT
X-AspNet-Version: 2.0.50727
Content-Encoding: gzip
Cache-Control: private, max-age=31536000
Expires: Wed, 03 Jun 2009 17:24:36 GMT
Content-Type: text/html; charset=utf-8
Content-Length: 6385
Connection: Close
-----
  1. Почему свойство "Cache-Control" отображается дважды?
  2. Нужны ли мне свойства "Cache-Control" и "Expires"?
  3. Является ли "Page_Load" лучшим местом для размещения этого кода?

Спасибо!

Ответы [ 2 ]

22 голосов
/ 25 июня 2009

Возможно, вы также захотите добавить эту строку, если вы устанавливаете максимальный возраст:

// Summary:
// Sets Cache-Control: public to specify that the response is cacheable
// by clients and shared (proxy) caches.    
Response.Cache.SetCacheability(HttpCacheability.Public);

Я много работаю с заголовком ответа с документами и изображениями из обработчика файлов, который обрабатывает запросы на файлы, сохраненные в БД.

В зависимости от вашей цели вы можете принудительно заставить браузеры кэшировать почти все страницы в течение нескольких дней локально (если это то, что вам нужно / нужно).

редактирование:

Я также думаю, что вы можете установить максимальный возраст неправильно ...

Response.Cache.SetMaxAge(new TimeSpan(dt.Ticks - DateTime.Now.Ticks ));

этот набор строк имеет 30-минутное время кэширования в локальном браузере [max-age = 1800]

Что касается строк управления кэш-памятью 2x ... вы можете проверить, установлен ли IIS для автоматического добавления заголовка.

12 голосов
/ 03 июня 2009

Я не вижу, чтобы Cache-control появлялся дважды. Один в запросе, другой в ответе. Вероятно, в запросе вы нажали Shift + F5 в браузере или что-то подобное.

На ваш второй вопрос: это зависит от того, чего вы хотите достичь с помощью заголовков кэша.

Я не знаю, чего вы хотели достичь с максимальным возрастом. Значение слишком велико, поскольку вы неправильно преобразовали DateTime в TimeSpan. Почему бы вам просто не использовать TimeSpan.FromMinutes?

Загрузка страницы в порядке. Я обычно сам возился с заголовками HTTP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...