我有一个用户控件,在一个受到重创的网站的几个页面上有特色。其中一些页面包括我们的博客侧边栏,我们的论坛侧边栏,以及正好在我们主页的中间。这意味着这个控件渲染了很多。控制它意味着在特定帐户的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数据时缓存的提示,而不是错误信息?
提前致谢
答案 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提要的结果。