我应该输出缓存我的控件查找twitter RSS onload吗?

时间:2010-03-09 14:36:45

标签: c# asp.net rss outputcache xmlreader

我有一个用户控件,在一个受到重创的网站的几个页面上有特色。其中一些页面包括我们的博客侧边栏,我们的论坛侧边栏,以及正好在我们主页的中间。这意味着这个控件渲染了很多。控制它意味着在特定帐户的Twitter RSS提要中读取并写出最后2条推文。以下是我控制的Page_Load的大部分内容。我在try {} catch中有它,因为在生产时,网站似乎无法经常加载XML,所以我需要翻转友好的错误消息。

try {
  var feed = XmlReader.Create(ResourceManager.GetString("TwitterRSS"));
  var latestItems = SyndicationFeed
    .Load(feed)
    .GetRss20Formatter()
    .Feed
    .Items
    .Take(2);

  rptTwitter.ItemDataBound += new RepeaterItemEventHandler(rptTwitter_ItemDataBound);
  rptTwitter.DataSource = latestItems;
  rptTwitter.DataBind();

} catch (Exception ex) {
  phError.Visible = true;
}

正如您所看到的,我只是获取最近的2个项目,并在前端的转发器中重复它们。如果有任何失败,我会翻转错误PlaceHolder,上面写着“Twitter不可用”的内容。

我经常在prod网站上看到这条错误消息,所以我想知道它是否对RSS feed提出了太多请求。我在想输出缓存控件10分钟,但我想,“如果它在错误状态下被缓存了怎么办?”然后保证显示错误消息面板10分钟。我的问题是,如果它在创建新缓存版本时显示catch的错误,那么真的会缓存10分钟(假设我设置Duration="600")?有没有人有任何关于如何使这项工作更好或在只提供真正的Twitter数据时缓存的提示,而不是错误信息?

提前致谢

1 个答案:

答案 0 :(得分:1)

而不是缓存整个页面,我会{/ 3>}返回

var latestItems = .... 

声明以及收到错误。您可以使每个不同的缓存持续时间如此,如果您成功获取数据,则缓存时间比发生错误时更长。一个实现看起来像这样:

object Twitter = Cache["MyTwitter"];

if(Twitter==null)
{
    // cache empty
    try
    { 
        var latestItems = (load items)
        Cache.Insert("MyTwitter", latestitems, null, DateTime.Now.AddSeconds(600),
            Cache.NoSlidingExpiration);
        Twitter = latestitems;
    }
    catch(Exception ex)
    {
        Cache.Insert("MyTwitter", ex.ToString(), null, DateTime.Now.AddSeconds(60),
            Cache.NoSlidingExpiration);
        Twitter = ex.ToString();
    }
}

if(Twitter is string)
{
    phError.Visible = true;
}
else
{
    rptTwitter.DataSource = Twitter;
    // rest of data binding code here
}

这里有两个部分。第一部分是检查缓存,如果对象不在缓存中,请进行加载。如果有错误,只需在缓存中存储一​​个字符串。

然后与你对象,如果它是一个字符串你知道你有一个错误。否则,这是检索Twitter提要的结果。