2012-04-16 2 views
6

Мы используем довольно большой сайт с ASP.NET MVC 3 и AppFabric в качестве распределенного кэширования. Мы внедрили пользовательский OutputCacheAdapter для использования нашего кластера AppFabric.ASP.NET MVC удаляет выходнойcache для каждого действия

Мы видим, что ASP.NET вызывает метод OutputCacheProvider.Get() для каждого действия, даже если это действие НЕ украшено атрибутом @OutputCacheAttribute.

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

ответ

4

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

Вам необходимо будет изменить поставщика кеша, чтобы он мог быстро определить, может ли страница быть потенциально кэширована. Только если это страница cachable, то она должна идти и проверять распределенный кеш. Эта проверка не может основываться на OutputCacheAttribute, поскольку они недоступны во время этой части обработки запроса. Вместо этого следует быстро проверить URL-адрес, файлы cookie и другую информацию заголовка HTML.

+0

Да, это звучит как хорошее объяснение. На самом деле это не так уж и много, хотя и принять штраф за производительность, вернуться к умолчанию OutputCacheProvider или предоставить что-то вроде черного или белого списка для URLS. – TheNameless

+1

@ TheNameless Я не сделал это сам, но вы не можете получить параметры маршрута [как-то] (http://www.scottschluer.com/creating-a-routedata-instance-from-a-url/), а затем использовать отражение для изучения атрибутов контроллера/действия? Это не идеальный вариант, но, вероятно, еще быстрее, чем сеть в оба конца. – Basic

0

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

Смежные вопросы