Должен ли я выводить в кэш свой элемент управления, который просматривает твиттер RSS onload? - PullRequest
1 голос
/ 09 марта 2010

У меня есть пользовательский элемент управления, который размещен на нескольких страницах сайта с большим количеством посещений. Некоторые из этих страниц включают нашу боковую панель блога, нашу боковую панель форума и прямо по центру нашей домашней страницы. Это означает, что этот элемент управления отображается много. Элемент управления, предназначенный для чтения в твиттере RSS-канала для определенной учетной записи и записи последних двух твитов. Ниже приведено большинство моих 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, которая говорит что-то вроде «Твиттер недоступен».

Я часто вижу это сообщение об ошибке на сайте prod, поэтому мне интересно, не слишком ли много запросов к RSS-каналу. Я думал о выводе в кеширование элемента управления в течение 10 минут, но я подумал: «Что, если он кэшируется в состоянии ошибки»? Тогда гарантированно будет отображаться панель сообщений об ошибках в течение 10 минут. У меня такой вопрос, правда ли, что если при создании новой кешированной версии она отображает ошибку от перехвата, будет ли она действительно кешироваться в течение 10 минут (если я установил Duration="600")? У кого-нибудь есть какие-либо советы о том, как я могу сделать это лучше или кэшировать, когда отображаются только реальные данные Twitter, а не сообщение об ошибке?

Заранее спасибо

1 Ответ

1 голос
/ 09 марта 2010

Вместо кэширования всей страницы, я бы кэшировал данные приложения , возвращаемые вашим

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
}

Здесь есть две части. Первая часть - проверка кеша, и если объект не находится в кеше, загрузите его. Если есть ошибка, просто сохраните строку в кеше.

Тогда с вашим объектом, если это строка, вы знаете, что у вас есть ошибка. В противном случае это результат получения твиттера.

...