MVC Donut Caching не работает должным образом после развертывания онлайн
Мы используем MVC Donut Caching и целый день пытались отладить эту проблему, которую мне так и не удалось найти решение.
Мы решили начать использовать атрибут DonutOutputCache поверх OutputCache и, отметив, что некоторые действия с частичным представлением, имеющие атрибут DonutOutputCache, не кэшируются в соответствии с параметрами кэширования.
У нас есть представление (индекс) со следующими вложенными частичными представлениями. Те, которые имеют атрибут кэша пончиков, указаны в квадратных скобках.
- _LayoutMainBase.cshtml
- _Header (PartialView)
- _HeaderBottomStrip (PartialView)
- _HeaderMainMenu (ParialView)
[DonutOutputCache(Duration = 3600)]
- _HeaderMainMenu (ParialView)
- _HeaderBottomStrip (PartialView)
- RenderBody () (HomeController.Index)
[DonutOutputCache(Duration = 3600)]
- ...
- _Header (PartialView)
Благодаря ведению журнала мы обнаружили, что действие частичного просмотра _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
и решил эту проблему.