#c# #caching #rss #sitecore
#c# #кэширование #RSS-канал #sitecore
Вопрос:
Я работал над внедрением пользовательского RSS-канала в sitecore 6.4. Мое пользовательское поведение очень ограничено, все, что я действительно хотел, это добавить ссылку для автора (наше поле author является ссылочным полем, поэтому мы не можем использовать встроенную атрибуцию автора).
Я переопределил RenderItem()
PublicFeed
класс, чтобы я мог использовать свою собственную реализацию FeedRenderer
класса (где размещена логика автора). мой подход следует этому шаблону, изложенному Джоном Уэстом, для добавления вашего собственного поведения рендеринга:
public class MyPUblicFeed: PublicFeed
{
protected override SyndicationItem RenderItem(Item item)
{
Assert.ArgumentNotNull(item, "item");
Control rendererControl = FeedUtil.GetFeedRendering(item);
if (rendererControl == null)
{
return null;
}
using (new ContextItemSwitcher(item))
{
var myRenderer= rendererControl as MyFeedRenderer;
if (myRenderer!= null)
{
myRenderer.Database = SitecoreHelper.CurrentDatabase.Name;
return myRenderer.RenderItem();
}
var renderer = rendererControl as Sitecore.Web.UI.WebControls.FeedRenderer;
if (renderer != null)
{
renderer.Database = SitecoreHelper.CurrentDatabase.Name;
return renderer.RenderItem();
}
}
throw new InvalidOperationException("FeedRenderer rendering must be of Sitecore.Web.UI.WebControls.FeedRenderer type");
}
}
А теперь для моего класса рендеринга:
public class MyFeedRenderer: Sitecore.Web.UI.WebControls.FeedRenderer
{
public override SyndicationItem RenderItem()
{
Item item = base.GetItem();
var syndicationItem = base.RenderItem();
//unfortunately we have to parse params again :(
FeedRenderingParameters feedRenderingParameter = FeedRenderingParameters.Parse(base.Parameters);
AddAuthor(syndicationItem, item, feedRenderingParameter);
return syndicationItem;
}
private static void AddAuthor(SyndicationItem syndicationItem, Item item, FeedRenderingParameters feedRenderingParameter)
{
//clear out authors added by base class
syndicationItem.Authors.Clear();
//logic for adding author here
}
}
все это отлично работает, выводя именно то, что я хочу, но элемент кэширования, похоже, не работает. Я установил cacheable
флаг для самого фактического элемента с интервалом 01:00:00
времени. Похоже, это не сработало — если я помещаю точку останова в любой из вышеупомянутых классов, она попадает каждый раз, когда запрашивается канал.
итак, затем я попытался включить кэширование на уровне управления, включив кэширование VaryByData
для MyFeedRenderer
рендеринга. увы, это тоже не работает, точка останова достигается каждый раз.
Кто-нибудь может дать какие-либо советы по этому вопросу? в документации просто рекомендуется включить его для фактического элемента ленты, а не на уровне рендеринга, но, похоже, ни один из них не работает для меня. Интересно, что кэширование HTML работает в другом месте — RSS также помещается в кэш HTML?
Заранее спасибо, Ник
Ответ №1:
-Убедитесь, что флажок Кэширования в элементе определения канала установлен.
-Убедитесь, что вы опубликовали элемент определения канала.
-Если вы не заполняете поле Длительности кэша в элементе определения канала, по умолчанию оно должно составлять один день.
-Каналы, по-видимому, кэшируются в Sitecore.Синдикация.Менеджер каналов.Кэш, а не кэш вывода сайта. Проверьте этот объект кэша в отладчике Visual Studio после вызова вашего канала, а затем еще раз после вызова этого канала во второй раз, чтобы попытаться увидеть, появляются ли какие-либо записи и отображаются ли несколько ключей кэша для одного и того же канала. Исследуйте метод Render(); если PublicFeed.IsCacheable() возвращает false (в зависимости от кэшируемого поля в элементе определения канала), PublicFeed.Render() не кэширует.
-Убедитесь, что ничто другое не очищает кеши между вашими запросами на канал.
Тема форума SDN: http://sdn.sitecore.net/forum/ShowPost.aspx ?postID=40591
Комментарии:
1. спасибо, что добавили сюда свой вклад, Джон — хорошая работа, присоединившись к SO также 🙂 Вы когда-нибудь задумывались о настройке обмена стеками специально для sitecore?