Страница ASP.NET MVC с ResponseCache при действии возвращает кеш нового контента вместо кеша - PullRequest
0 голосов
/ 26 ноября 2018

Я следовал этому руководству (https://docs.microsoft.com/en-us/aspnet/core/performance/caching/response?view=aspnetcore-2.1), чтобы реализовать ResponseCache на моем действии контроллера.

Короче говоря, я добавил services.AddResponseCaching(); и app.UseResponseCaching(); в автозагрузку и этот тег [ResponseCache( Duration = 30)]на моем контроллере.

Затем я добавил <h2>@DateTime.Now</h2> в моем представлении, и то, что я ожидал ... было то же время datetime.now в течение 30 секунд.

Но это не так,он просто показывает новое время при каждой перезагрузке (F5).

Я убедился, что мои devtools в chrome не говорят «отключить кеш».

Это как с открытыми, так и без открытых devtools,на моем локальном компьютере, теперь пытаюсь создать совершенно новый .net core mvc project.

Одна вещь, которую я заметил (с открытым devtools), заключается в том, что запрос имеет следующий заголовок: Cache-Control: max-age=0. Влияет ли это наповедение? Я думал, что это будет что-то значить, потому что похоже, что запрос говорит «нет кэша», но это кажется мне странным, потому что я не вставил заголовок, и я бы сказал, что поведение chrome по умолчанию не будет игнорировать кэши

1 Ответ

0 голосов
/ 26 ноября 2018

Заголовок, подобный Cache-Control: max-age=0, эффективно отключает все кэширование.Ресурсы в основном истекают, как только они выходят из сети, поэтому они всегда извлекаются.Этот заголовок происходит с сервера.Клиент не имеет к этому никакого отношения.

Если вы случайно не отключили кэширование ответов вручную.Затем, наиболее вероятная ситуация заключается в том, что вы делаете что-то, где промежуточное программное обеспечение кэширования ответов никогда не будет кэшироваться.В документации перечислены следующие условия, которые должны быть выполнены перед кэшированием ответов, независимо от того, что вы делаете:

  • Запрос должен привести к ответу сервера с200 (ОК) код состояния.
  • Метод запроса должен быть GET или HEAD.
  • Терминальное промежуточное программное обеспечение, такое как промежуточное программное обеспечение статических файлов, не должно обрабатывать ответ до промежуточного программного обеспечения кэширования ответов.
  • Заголовок авторизации не должен присутствовать.
  • Параметры заголовка Cache-Control должны быть действительными, а ответ должен быть помечен как открытый и не помечен как частный.
  • Прагма: нетЗаголовок -cache не должен присутствовать, если заголовок Cache-Control отсутствует, так как заголовок Cache-Control переопределяет заголовок Pragma при его наличии.
  • Заголовок Set-Cookie не должен присутствовать.
  • Различные параметры заголовка должны быть действительными и не равными *.
  • Значение заголовка Content-Length (если установлено) должно соответствовать размеру ответа body.
  • IHttpSendFileFeature не используется.
  • Ответ не должен быть устаревшим, как указано в заголовке Expires и директивах кэша max-age и s-maxage.
  • Буферизация ответа должна быть успешной, а размер ответа должен быть меньше, чем сконфигурированный или по умолчанию SizeLimit.
  • Ответ должен быть кэшируемым в соответствии со спецификациями RFC 7234.Например, директива no-store не должна существовать в полях заголовка запроса или ответа.Подробнее см. Раздел 3: Хранение ответов в кэшах RFC 7234.

Однако в таких ситуациях сервер должен отправлять Cache-Control: no-cache, а не max-age=0.В результате я склоняюсь к некоторой неправильной конфигурации где-то, где вы установили это максимальное значение возраста и либо забыли, либо забыли его.

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