кэширование sitecore RSS

#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?