从c# SyndicationFeed中读取所有rss项目

本文关键字:rss 项目 读取 SyndicationFeed | 更新日期: 2023-09-27 18:03:13

我正在尝试使用System.ServiceModel.Syndication从c#代码中读取RSS提要

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

代码工作完美,但只给我25个提要项。

对于相同的feed url,在Google reader等阅读器中可以清楚地看到100多个条目。

如何在SyndicationFeed中获得超过25个提要项目?

从c# SyndicationFeed中读取所有rss项目

简而言之,除非提要提供者为其提要提供了自定义分页,或者可能通过推断帖子/日期结构,否则您无法获得超过25篇文章。因为你知道有>25个帖子并不意味着他们可以通过feed访问。RSS被设计用来显示最新的帖子;它不是为了满足档案需求而设计的,也不是为了像web服务一样使用。分页也不是RSS规范或Atom规范的一部分。参见另一个答案:如何在RSS提要中获取所有旧条目?

Google Reader的工作方式是这样的:Google的爬虫在新feed首次在互联网上发布后不久就会检测到它,并且爬虫会定期访问它。每次访问时,它都会将所有的新帖子存储在谷歌的服务器上。通过在爬虫找到新提要时立即存储提要项,它们可以将所有数据返回到提要的开始处。复制此功能的唯一方法是在新提要启动时开始归档,这是不切实际且不太可能的。

综上,SyndicationFeed将得到>如果提要地址中有超过25项,则为25项。

试试这个;

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));
    }

feedresults .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);
        }
    }
}

示范在这里。警告,还没有google chrome的格式