从C#SyndicationFeed中读取所有rss项

时间:2013-03-09 20:44:59

标签: c# rss syndication-feed

我正在尝试使用System.ServiceModel.Syndication

从C#代码中读取RSS提要
var reader = XmlReader.Create(feedUrl);
var feed = SyndicationFeed.Load(reader);

代码很完美,但只给了我25个Feed项。

对于相同的Feed网址,Google阅读器等读者可以清楚地看到超过一百个项目。

如何在SyndicationFeed中获得超过25个Feed项?

2 个答案:

答案 0 :(得分:3)

简而言之,除非Feed提供商为其Feed添加了自定义分页,或者可能通过推断帖子/日期结构,否则您不能获得超过这25个帖子。只是因为你知道有> 25个帖子并不意味着它们可以通过Feed获得。 RSS旨在显示最新帖子;它不是用于存档需求,也不是用于Web服务。分页也不属于RSS specAtom spec。请参阅其他答案:How Do I Fetch All Old Items on an RSS Feed?

Google阅读器以这种方式工作:Google的抓取工具在首次在互联网上发布后立即检测到新的Feed,并且抓取工具会定期访问它。每次访问时,它都会在Google服务器上存储所有新帖子。通过在抓取工具找到新Feed时立即存储Feed项,他们将所有数据都返回到Feed的开头。您可以复制此功能的唯一方法是在新Feed开始时开始存档,这是不切实际且不太可能的。

总之,SyndicationFeed会得到>如果Feed地址中有超过25个项目,则为25项。

答案 1 :(得分: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);
        }
    }
}

演示是HERE。但是警告,还没有谷歌浏览器的格式