4

System.ServiceModel.Syndicationを使用してC#コードからRSSフィードを読み取ろうとしています

var reader = XmlReader.Create(feedUrl);
var feed = SyndicationFeed.Load(reader);

コードは完璧に機能しますが、25個のフィードアイテムしか提供されません。

同じフィードURLの場合、Googleリーダーなどのリーダーには100を超えるアイテムがはっきりと表示されます。

SyndicationFeedで25を超えるフィードアイテムを取得するにはどうすればよいですか?

4

2 に答える 2

3

つまり、フィードプロバイダーがフィードにカスタムのページ付けを提供していない限り、またはおそらく投稿/日付の構造を推測することによって、25を超える投稿を取得することはできません。25を超える投稿があることを知っているからといって、フィードから利用できるとは限りません。RSSは、最新の投稿を表示するように設計されています。アーカイブのニーズや、Webサービスのように使用することを目的としたものではありません。ページ付けもRSS仕様またはAtom仕様の一部ではありません。この他の回答を参照してください:RSSフィードのすべての古いアイテムを取得するにはどうすればよいですか?

Googleリーダーは次のように機能します。Googleのクローラーは、インターネット上で最初に公開された直後に新しいフィードを検出し、クローラーは定期的にフィードにアクセスし続けます。訪問するたびに、すべての新しい投稿がGoogleのサーバーに保存されます。クローラーが新しいフィードを見つけるとすぐにフィードアイテムを保存することで、すべてのデータがフィードの先頭に戻ります。この機能を複製できる唯一の方法は、新しいフィードの開始時にアーカイブを開始することです。これは実用的ではなく、ありそうもないことです。

合計SyndicationFeedすると、フィードアドレスに25を超えるアイテムがある場合、25を超えるアイテムが取得されます。

于 2013-03-09T20:57:30.267 に答える
0

これを試して;

private const int PostsPerFeed = 25; //Change this to whatever number you want

次に、あなたの行動:

    public ActionResult Rss()
    {
        IEnumerable<SyndicationItem> posts =
            (from post in model.Posts
             where post.PostDate < DateTime.Now
             orderby post.PostDate descending
             select post).Take(PostsPerFeed).ToList().Select(x => GetSyndicationItem(x));

        SyndicationFeed feed = new SyndicationFeed("John Doh", "John Doh", new Uri("http://localhost"), posts);
        Rss20FeedFormatter formattedFeed = new Rss20FeedFormatter(feed);
        return new FeedResult(formattedFeed);
    }

    private SyndicationItem GetSyndicationItem(Post post)
    {
        return new SyndicationItem(post.Title, post.Body, new Uri("http://localhost/posts/details/" + post.PostId));
    }

FeedResult.cs

class FeedResult : ActionResult
{
    private SyndicationFeedFormatter formattedFeed;

    public FeedResult(SyndicationFeedFormatter formattedFeed)
    {
        this.formattedFeed = formattedFeed;
    }

    public override void ExecuteResult(ControllerContext context)
    {
        context.HttpContext.Response.ContentType = "application/rss+xml";
        using (XmlWriter writer = XmlWriter.Create(context.HttpContext.Response.Output))
        {
            formattedFeed.WriteTo(writer);
        }
    }
}

デモストレーションはこちらです。警告ですが、グーグルクロームのフォーマットはまだありません

于 2013-03-09T21:07:13.393 に答える