我正在尝试使用 System.ServiceModel.Syndication 从 C# 代码中读取 RSS 提要
var reader = XmlReader.Create(feedUrl);
var feed = SyndicationFeed.Load(reader);
代码运行完美,但只给了我 25 个提要项。
对于相同的提要 url,在谷歌阅读器等阅读器中可以清楚地看到数百个项目。
如何在 SyndicationFeed 中获得超过 25 个提要项目?
我正在尝试使用 System.ServiceModel.Syndication 从 C# 代码中读取 RSS 提要
var reader = XmlReader.Create(feedUrl);
var feed = SyndicationFeed.Load(reader);
代码运行完美,但只给了我 25 个提要项。
对于相同的提要 url,在谷歌阅读器等阅读器中可以清楚地看到数百个项目。
如何在 SyndicationFeed 中获得超过 25 个提要项目?
简而言之,除非提要提供者为其提要提供了自定义分页,或者可能通过推断发布/日期结构,否则您不能获得超过这 25 个帖子。仅仅因为您知道有超过 25 个帖子并不意味着它们将通过提要提供。RSS 旨在显示最新的帖子;它的目的不是为了存档需求,也不是为了像 Web 服务一样使用。分页也不是RSS 规范或Atom 规范的一部分。请参阅其他答案:如何获取 RSS 提要上的所有旧项目?
谷歌阅读器是这样工作的:谷歌的爬虫在新的提要首次上线后不久就检测到它,并且爬虫会定期访问它。每次访问时,它都会将所有新帖子存储在 Google 的服务器上。通过在其搜寻器发现新提要后立即存储提要项目,它们可以将所有数据返回到提要的开头。您可以复制此功能的唯一方法是在新提要开始时开始存档,这是不切实际且不太可能的。
总之,SyndicationFeed
如果提要地址中有超过 25 个项目,则将获得 > 25 个项目。
Try this;
private const int PostsPerFeed = 25; //Change this to whatever number you want
Then your action:
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));
}
In your 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);
}
}
}
Demostration is HERE. Warning though, no format for google chrome yet