Кэширование вывода настраиваемого элемента управления (серверный элемент управления)

Я встречал намеки на кэширование вывода для серверного элемента управления, но еще не нашел окончательного ответа на вопрос: можно ли кэшировать вывод серверного элемента управления (точно так же, как кэшируются пользовательские элементы управления)?

Предложения, с которыми я столкнулся, включают кеширование данных (а не истинное кеширование вывода) или предлагают установить параметры response.cache. В идеале я хотел бы иметь возможность перетащить серверный элемент управления на страницу и установить свойства с теми же именами, что и директива outputcache:

Пример:

<cc1:MyCustomControl ID="ctl1" runat="server" CacheDuration="200" VaryByCustom="user" />

Я собирался покопаться в структуре, чтобы увидеть, как на самом деле работает кэширование вывода, но надеялся найти некоторую информацию для начала. Из моего ограниченного понимания, синтаксический анализатор решает, кэшируется ли страница / пользовательский элемент управления. Поскольку серверные элементы управления не анализируются, невозможно остановить выполнение кода. Я полагаю, я мог бы инициализировать логическое значение «IsInCache» и убедиться, что все методы проверяют эту переменную перед выполнением кода. Это не полностью исключит выполнение серверного элемента управления, но может достаточно повысить производительность, избегая обращений к базе данных и привязки данных к элементам управления.

Я все еще использую .NET 3.5, и у меня не было много времени для изучения модели поставщика OutputCache в .NET 4.0. Может в последней версии фреймворка есть решение?

Есть предположения?


person ByteCrunchr    schedule 17.09.2010    source источник


Ответы (1)


Я тоже искал это, и я решил добавить решение на эту страницу, так как оно появилось в моем веб-поиске. Существует атрибут PartialCaching, который применяется к серверному / настраиваемому элементу управления для достижения того же эффекта, что и директива OutputCache, используемая в шаблонах ascx и aspx. Он также принимает те же параметры (VaryByParameter и т. Д.). Например:

[PartialCaching(1000, "foo", null, null)]
public class ClientScriptVariableBlock : Control {
  ...
}

Сантехника ASP обрабатывает это так же, как атрибут шаблона, поэтому конечный результат такой же. Это ценно (в моем случае), потому что я могу создавать общие серверные элементы управления вне самого веб-проекта, которые можно кэшировать. Шаблоны ASCX не очень хорошо работают во внешних сборках :)

person Community    schedule 19.11.2010
comment
Спасибо! Я обязательно это проверю. Мое текущее решение включает подклассы элементов управления .NET и переопределение каждого подпрограммы On ..., чтобы события не вызывались для любого элемента управления, который я указал с параметрами кеша. Я программно добавляю элемент управления в кеш с помощью ключа на основе параметров VaryBy ..., CacheDuration и т.д. Это. - person ByteCrunchr; 22.11.2010
comment
На первый взгляд кажется, что нет возможности изменить значения, определенные в PartialCachingAttribute. Если он работает так же, как директива OutputCache пользовательского элемента управления, PageParser считывает атрибуты, поэтому нет возможности ввести какие-либо данные переменных в процесс. - person ByteCrunchr; 22.11.2010
comment
Нет, я не думаю, что есть способ сделать это. - person kprobst; 23.11.2010