Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/284.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该输出缓存查找twitter RSS onload的控件吗?_C#_Asp.net_Rss_Outputcache_Xmlreader - Fatal编程技术网

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

C# 我应该输出缓存查找twitter RSS onload的控件吗?,c#,asp.net,rss,outputcache,xmlreader,C#,Asp.net,Rss,Outputcache,Xmlreader,我有一个用户控件,它出现在一个点击率很高的网站的几个页面上。其中一些页面包括我们的博客侧栏,我们的论坛侧栏,以及在我们的主页中间的SMAK。这意味着该控件被渲染了很多。该控件用于读取特定帐户的twitter RSS提要并写出最后2条推文。下面是该控件的大部分页面加载。我把它放在一个try{}catch中,因为在生产环境中,站点似乎无法经常加载XML,所以我需要打开一条友好的错误消息 try { var feed = XmlReader.Create(ResourceManager.GetSt

我有一个用户控件,它出现在一个点击率很高的网站的几个页面上。其中一些页面包括我们的博客侧栏,我们的论坛侧栏,以及在我们的主页中间的SMAK。这意味着该控件被渲染了很多。该控件用于读取特定帐户的twitter RSS提要并写出最后2条推文。下面是该控件的大部分页面加载。我把它放在一个
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;
}
如您所见,我只是获取最近的两个项目,并在前端的中继器中对它们进行重复。如果有什么失败,我会打开错误占位符,上面写着“Twitter不可用”

我经常在prod站点上看到这个错误消息,所以我想知道它是否对RSS提要发出了太多的请求。我曾考虑将控件的输出缓存10分钟,但我想,“如果它缓存在错误状态会怎么样?”?然后保证显示错误消息面板10分钟。我的问题是,如果它在创建新的缓存版本时显示catch中的错误,那么它真的会被缓存10分钟吗(假设我设置
Duration=“600”
)?如果只呈现真实的Twitter数据,而不是错误消息,那么有没有人能告诉我如何更好地工作或缓存这些数据


提前感谢

我不会缓存整个页面,而是通过您的

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

我不会缓存整个页面,而是由您的

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
}
这里有两个部分。第一部分是检查缓存,如果对象不在缓存中,则进行加载。如果出现错误,只需在缓存中存储一个字符串


然后使用对象,如果它是一个字符串,您知道您有错误。否则,这是检索推特提要的结果。

谢谢!这是一段很棒的代码片段。我用过了,效果很好。谢谢!这是一段很棒的代码片段。我用过,效果很好。