Кэширование ASP.NET MVC и IE - манипулирование заголовками ответов неэффективно

История вопроса

Я пытаюсь помочь коллеге отладить проблему, которая не возникала в течение последних 6 месяцев. После самого последнего развертывания приложения ASP.NET MVC 2 ответы FileResult , которые заставляют пользователя открывать или сохранять файл PDF, не могут существовать на клиентском компьютере достаточно долго, чтобы программа чтения PDF открыла их.

Более ранние версии IE (особенно 6) - единственные затронутые браузеры. Firefox, Chrome и более новые версии IE (> 8) ведут себя должным образом. Имея это в виду, следующий раздел определяет действия, необходимые для воссоздания проблемы.

Поведение

  1. Пользователь щелкает ссылку, которая указывает на метод действия (простая гиперссылка с атрибутом href ).
  2. Метод действия создает PDF-файл, представленный как поток байтов. Метод всегда воссоздает PDF.
  3. В методе действия устанавливаются заголовки, указывающие браузерам, как кэшировать ответ. Это:

     response.AddHeader («Cache-Control», «общедоступный, обязательная повторная проверка, пост-проверка = 0, предварительная проверка = 0»);
    response.AddHeader («Прагма», «без кеширования»);
    response.AddHeader («Истекает», «0»);
    

    Для тех, кто не знает, что именно делают заголовки :

    a. Cache-Control: public

    Указывает, что ответ МОЖЕТ быть кэширован любым кешем, даже если он обычно не кэшируется или кэшируется только в не разделяемом кэше.

    б. Cache-Control: must-revalidate

    Когда директива must-revalidate присутствует в ответе, полученном кешем, этот кеш НЕ ДОЛЖЕН использовать запись после того, как она станет устаревшей, для ответа на последующий запрос без предварительной повторной проверки его исходным сервером

    c. Cache-Control: предварительная проверка (введена в IE5)

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

    г. Cache-Control: post-check (введено в IE5)

    Определяет интервал в секундах, после которого сущность должна проверяться на актуальность перед показом пользователю ресурса.

    e. Pragma: no-cache (для обеспечения обратной совместимости с HTTP / 1.0)

    Когда в сообщении запроса присутствует директива no-cache, приложение ДОЛЖНО пересылать запрос исходному серверу, даже если оно имеет кэшированную копию того, что запрашивается

    f. Expires

    В поле заголовка объекта Expires указывается дата / время, после которых ответ считается устаревшим.

  4. Возвращаем файл из действия

     return File (file, «mime / type», fileName);
    
  5. Пользователю предоставляется диалоговое окно «Открыть / сохранить».

  6. Нажатие кнопки «Сохранить» работает, как ожидалось, но нажатие кнопки «Открыть» запускает программу чтения PDF, но сохраненный временный файл IE уже был удален к моменту, когда программа чтения пытается открыть файл, поэтому жалуется, что файл отсутствует (и это так).

Здесь есть полдюжины других приложений, которые используют те же заголовки для принудительного использования Excel, CSV, PDF, Word и тонны другого контента у пользователей, и никогда не возникало проблем.

Вопрос

  • Правильны ли заголовки для того, что мы пытаемся сделать? Мы хотим, чтобы файл существовал временно (был кеширован), но всегда заменялся новыми версиями, даже если запросы могут быть идентичными).

Заголовки ответа устанавливаются в методе действия перед возвратом FileResult . Я попросил своего коллегу попробовать создать новый класс, унаследованный от FileResult , и вместо этого переопределить метод ExecuteResult , чтобы он изменял заголовки, а затем выполнял base.ExecuteResult () вместо этого - нет статуса по этому поводу.

У меня подозрение, что в заголовке «Истекает» значение «0». Согласно этой статье W3C , установка значения «0» подразумевает, что срок действия уже истек. Я действительно хочу, чтобы срок его действия истек, я просто не хочу, чтобы IE удалял его из файловой системы до того, как приложение, обрабатывающее его, получит возможность его открыть.

Как всегда, спасибо!

Изменить: Решение

При дальнейшем тестировании (с использованием Fiddler для проверки заголовков) мы увидели, что заголовки ответов, которые, как мы думали, устанавливались, не были теми, которые интерпретируются браузером. Поскольку я сам не был знаком с кодом, я не осознавал основную проблему: заголовки топтались вне метода действия.

Тем не менее, я оставлю этот вопрос открытым. По-прежнему остается невыясненным следующее: кажется, есть некоторое несоответствие между заголовком Expires , имеющим значение 0 , и -1 .Если кто-то может претендовать на различия по дизайну, что касается IE , я все равно хотел бы услышать об этом. Что касается решения, приведенные выше заголовки работают так, как задумано, со значением Expires , установленным на -1 во всех браузерах.

Обновление 1

Сообщение Как контролировать кеширование веб-страниц во всех браузерах? подробно описывает, что кеширование можно предотвратить во всех браузерах с помощью установки Expires = 0. Я все еще не продано на этом 0 vs -1 аргумент ...

24
задан Community 23 May 2017 в 11:46
поделиться

0 ответов

Другие вопросы по тегам:

Похожие вопросы: