MVC Donut Caching не работает должным образом после развертывания онлайн

Мы используем MVC Donut Caching и целый день пытались отладить эту проблему, которую мне так и не удалось найти решение.

Мы решили начать использовать атрибут DonutOutputCache поверх OutputCache и, отметив, что некоторые действия с частичным представлением, имеющие атрибут DonutOutputCache, не кэшируются в соответствии с параметрами кэширования.

У нас есть представление (индекс) со следующими вложенными частичными представлениями. Те, которые имеют атрибут кэша пончиков, указаны в квадратных скобках.

  • _LayoutMainBase.cshtml
    • _Header (PartialView)
      • _HeaderBottomStrip (PartialView)
        • _HeaderMainMenu (ParialView) [DonutOutputCache(Duration = 3600)]
    • RenderBody () (HomeController.Index) [DonutOutputCache(Duration = 3600)]
    • ...

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

Этого не происходит

  • Если мы вернемся к атрибуту OutputCache
  • При локальном тестировании на наших рабочих станциях

Любое понимание того, что может быть причиной?

Спасибо за помощь!

1 ответ

Решение

Загрузив и проверив исходный код проекта MVC Donut Caching, мы наконец нашли причину, по которой это происходит.

Атрибут DonutOutputCache, определенный в этом проекте, использует IKeyBuilder для генерации ключа кэша, используемого для хранения выходного HTML-кода. Класс DevTrends.MvcDonutCaching.KeyBuilder по умолчанию, который поставляется вместе с проектом, генерирует ключ, который состоит из следующих частей:

  • Префикс
  • Имя контроллера
  • Название действия
  • Значения параметров строки запроса (зависит от CacheSettings.Options имея OutputCacheOptions.IgnoreQueryString флаг установлен на)
  • Параметры формы (зависит от CacheSettings.Options имея OutputCacheOptions.IgnoreFormData флаг установлен на)
  • Значения маршрута
  • Если у вас есть VaryByParam свойство установлено в:
    • none, тогда все значения строки запроса / формы / маршрута очищаются
    • Если у вас есть что-то кроме *то он бы рассматривал только такие параметры
  • VaryByCustom параметр в конечном итоге вызовет то же самое GetVaryByCustomString генератор ключей в пределах System.Web.HttpApplication,

Сгенерированный выше ключ вызывал у нас проблемы, так как другой ключ генерировался, когда мы не знали о таких параметрах. По этой причине методы вызывались несколько раз, так как веб-сайт находился на серверах продукта, пользователях, поисковых системах, ботах и ​​других запросах с различными значениями строки запроса / формы / маршрута, которые передавались и, следовательно, генерировался новый ключ.

Нашим решением было создать наш собственный IKeyBuilder который был передан вместо по умолчанию IKeyBuilder и решил эту проблему.

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