1

我有一个用户控件,它出现在一个热门网站的几个页面上。其中一些页面包括我们的博客侧边栏、我们的论坛侧边栏,以及位于我们主页中间的 smack。这意味着这个控件被渲染了很多。该控件用于读取特定帐户的 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 提要发出了太多请求。我正在考虑将控件输出缓存 10 分钟,但我想,“如果它在错误状态下被缓存怎么办”?然后保证显示错误消息面板 10 分钟。我的问题是,如果它在创建新缓存的版本时显示来自 catch 的错误,是否真的会缓存 10 分钟(假设我设置了Duration="600")?当只呈现真实的 Twitter 数据而不是错误消息时,有没有人有任何关于如何使这项工作更好或缓存的提示?

提前致谢

4

1 回答 1

1

我不会缓存整个页面,而是缓存您返回的应用程序数据

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 提要的结果。

于 2010-03-09T15:05:09.063 回答