2011-10-13 61 views
0

我一直致力于在sitecore 6.4中实现自定义RSS提要。我的自定义行为非常有限,我实际上想要为作者添加一个链接(我们的作者字段是引用字段,因此我们无法使用内置的作者归属)。sitecore RSS缓存

我在PublicFeed类推翻RenderItem(),这样我可以利用我自己实现的FeedRenderer类(在这里笔者逻辑封装)的。我的做法是遵循这个pattern outlined by John West添加自己的呈现行为:

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渲染。唉,这也不管用,每次都会触发断点。

任何人都可以提供有关此事的任何建议吗?文档只是建议在实际的Feed项目上打开它,而不是在渲染级别上,但是对于我来说都没有效果。有趣的是,HTML缓存在别处工作 - RSS是否也放入了HTML缓存?

由于提前, 尼克

回答

0

- 确保在饲料中定义项目可缓存复选框被选中。

- 确保您已发布Feed定义项目。

- 如果您未在Feed定义项目中填充“缓存持续时间”字段,则它应该默认为一天。

- Feeds似乎缓存在Sitecore.Syndication.FeedManager.Cache而不是站点输出缓存中。调用您的提要后,在Visual Studio调试器中检查该缓存对象,然后在再次调用该提要后再次检查该缓存对象,以尝试查看是否出现任何记录,以及是否针对同一个提要显示多个缓存键。研究Render()方法;如果PublicFeed.IsCacheable()返回false(取决于Feed定义项中的Cacheable字段),则PublicFeed.Render()不会缓存。

- 确保没有其他任何操作会清除您对Feed的请求之间的缓存。

SDN论坛主题:http://sdn.sitecore.net/forum/ShowPost.aspx?PostID=40591

+0

感谢这里添加您的输入约翰 - 良好的工作加入SO也:)你有没有想过专门为Sitecore的建立堆栈交换? – WickyNilliams