У меня есть приложение ASP.NET MVC 3. Это приложение запрашивает записи через jQuery. jQuery вызывает действие контроллера, которое возвращает результаты в формате JSON. Я не смог доказать это, но я обеспокоен тем, что мои данные могут кэшироваться.
Я хочу, чтобы кэширование применялось только к конкретным действиям, а не ко всем действиям.
Есть ли атрибут, который я могу добавить к действию, чтобы гарантировать, что данные не кэшируются? Если нет, как я могу гарантировать, что браузер каждый раз получает новый набор записей вместо кэшированного набора?
c#
jquery
.net
asp.net-mvc
asp.net-mvc-3
JavaScript Developer
источник
источник
Ответы:
Чтобы убедиться, что JQuery не кэширует результаты, в ваших методах ajax добавьте следующее:
Или чтобы предотвратить кэширование в MVC, мы создали наш собственный атрибут, вы можете сделать то же самое. Вот наш код:
Тогда просто украсьте свой контроллер с
[NoCache]
. ИЛИ, чтобы сделать это для всех, вы можете просто поместить атрибут в класс базового класса, от которого вы наследуете свои контроллеры (если он у вас есть), как у нас здесь:Вы также можете украсить некоторые действия этим атрибутом, если вам нужно, чтобы они не кэшировались, вместо того, чтобы украшать весь контроллер.
Если у вашего класса или действия не было времени,
NoCache
когда они отображались в вашем браузере, и вы хотите проверить его работоспособность, помните, что после компиляции изменений вам нужно выполнить «жесткое обновление» (Ctrl + F5) в вашем браузере. Пока вы этого не сделаете, ваш браузер сохранит старую кэшированную версию и не обновит ее «обычным обновлением» (F5).источник
Вы можете использовать встроенный атрибут cache, чтобы предотвратить кеширование.
Для .net Framework:
[OutputCache(NoStore = true, Duration = 0)]
Для .net Core:
[ResponseCache(NoStore = true, Duration = 0)]
Помните, что невозможно заставить браузер отключить кэширование. Лучшее, что вы можете сделать, - это предложить предложения, которые будут приняты большинством браузеров, обычно в форме заголовков или метатегов. Этот атрибут декоратора отключит кэширование сервера, а также добавит этот заголовок:
Cache-Control: public, no-store, max-age=0
. Он не добавляет метатеги. При желании их можно добавить вручную в представлении.Кроме того, JQuery и другие клиентские платформы будут пытаться обмануть браузер, заставляя его не использовать его кэшированную версию ресурса, добавляя в URL такие вещи, как метка времени или GUID. Это эффективно заставляет браузер снова запрашивать ресурс, но не мешает кешированию.
На последнем замечании. Вы должны знать, что ресурсы могут также кэшироваться между сервером и клиентом. Интернет-провайдеры, прокси-серверы и другие сетевые устройства также кэшируют ресурсы, и они часто используют внутренние правила, не обращая внимания на реальный ресурс. Вы ничего не можете с этим поделать. Хорошей новостью является то, что они обычно кешируются на более короткие промежутки времени, например, секунды или минуты.
источник
Cache-Control:public, no-store, max-age=0
. Он не добавляет метатеги. При желании их можно добавить вручную в представлении.NoStore = true
иDuration = 0
(что я использовал успешно, спасибо), но какой дополнительный эффект будетVaryByParam = "None"
иметь, так как два других параметра влияют на все запросы независимо от параметра?Все, что тебе нужно:
или, если вы хотите отключить его для всего контроллера:
Несмотря на обсуждение в комментариях здесь, этого достаточно, чтобы отключить кэширование браузера - это заставляет ASP.Net выдавать заголовки ответа, которые сообщают браузеру, что срок действия документа истекает немедленно:
источник
Cache-Control
наpublic
max-age=0
никогда не означало «кэш отключен». Это означает только то, что содержимое ответа считается немедленно устаревшим , но кэш может его кэшировать. Браузеры должны проверять свежесть кэшированного устаревшего содержимого перед его использованием, но это не обязательно, еслиmust-revalidate
не указана дополнительная директива .В действии контроллера добавьте в заголовок следующие строки
источник
Вот
NoCache
атрибут, предложенный mattytommo, упрощенный с использованием информации из ответа Криса Москини:источник
max-age=0
никогда не означало «кэш отключен». Это означает только то, что содержимое ответа считается немедленно устаревшим , но кэш может его кэшировать. Браузеры должны проверять свежесть кэшированного устаревшего содержимого перед его использованием, но это не обязательно, еслиmust-revalidate
не указана дополнительная директива .no-cache
, что все еще разрешает кэширование, но требует повторной проверки на сервере происхождения перед любым использованием. Чтобы избежать даже повторного проверки кэширования, вы должны добавитьno-store
вместе сno-cache
. (no-store
одно только явно неправильно, потому что энергозависимые кэши могут кэшировать контент, помеченный какno-store
.)Для MVC6 ( DNX ) нет
System.Web.OutputCacheAttribute
Примечание: когда вы установите
NoStore
параметра Длительность не учитывается. Можно установить начальную продолжительность для первой регистрации и переопределить ее с помощью пользовательских атрибутов.Но у нас есть
Microsoft.AspNet.Mvc.Filters.ResponseCacheFilter
Можно переопределить начальный фильтр с помощью пользовательского атрибута.
Вот пример использования
источник
Кэширование вывода в MVC
источник
Правильное значение атрибута для Asp.Net MVC Core для предотвращения кэширования браузера (включая Internet Explorer 11 ):
как описано в документации Microsoft:
Кэширование ответов в ASP.NET Core - NoStore и Location.None
источник
Решения ASP.NET MVC 5:
App_Start/FilterConfig.cs
«SRegisterGlobalFilters
метод:OutputCache
директиву на уровнеController
илиView
уровне. Для обычного контроллера этоили если это
ApiController
будетисточник