1

大ヒットしたサイトのいくつかのページで紹介されているユーザーコントロールがあります。これらのページの一部には、ブログサイドバー、フォーラムサイドバー、およびホームページの真ん中にあるスマックが含まれます。つまり、このコントロールは多くレンダリングされます。特定のアカウントのTwitterRSSフィードを読み取り、最後の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つのアイテムを取得し、フロントエンドのリピーターでそれらを繰り返します。何かが失敗した場合は、「Twitterは利用できません」などのエラーPlaceHolderをオンにします。

このエラーメッセージはprodサイトでよく見られるので、RSSフィードへのリクエストが多すぎるのではないかと思います。コントロールを10分間キャッシュする出力を考えていましたが、「エラー状態でキャッシュされるとどうなるか」と思いました。その後、10分間エラーメッセージパネルが表示されることが保証されています。私の質問は、新しくキャッシュされたバージョンを作成するときにキャッチからのエラーが表示された場合、それは本当に10分間キャッシュされるのでしょうか(私が設定したと仮定してDuration="600")?エラーメッセージではなく、実際のTwitterデータのみがレンダリングされたときに、これをより適切に機能させたり、キャッシュしたりするためのヒントはありますか?

前もって感謝します

4

1 に答える 1

1

ページ全体をキャッシュする代わりに、あなたから返されたアプリケーションデータをキャッシュします

var latestItems = .... 

ステートメント、およびエラーを受け取った場合。それぞれのキャッシュ期間を変えることができるので、データを正常に取得した場合は、エラーが発生した場合よりも長くキャッシュします。1つの実装は次のようになります。

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
}

ここには2つの部分があります。最初の部分はキャッシュをチェックすることであり、オブジェクトがキャッシュにない場合は、ロードを実行します。エラーが発生した場合は、文字列をキャッシュに保存するだけです。

次に、オブジェクトを使用して、文字列の場合はエラーが発生していることがわかります。それ以外の場合は、Twitterフィードを取得した結果です。

于 2010-03-09T15:05:09.063 に答える