A lightweight .NET RSS feed reader, parser, and aggregator for RSS 2.0, Atom 1.0, and RDF syndication feeds.
Version 2.x is a modern rewrite for .NET 8+ with async HTTP support, feed metadata, typed dates, caching, feed discovery, parallel multi-feed fetching, and dependency injection.
Keywords: RSS reader, RSS parser, Atom reader, Atom parser, syndication feed, feed aggregator, XML feed parser, HTTP feed fetcher, podcast RSS, feed discovery, .NET 8, dependency injection.
dotnet add package SimpleRSSusing SimpleRSS;
using var reader = new FeedReader();
var feed = await reader.GetFeedAsync("https://example.com/feed.rss");
Console.WriteLine(feed.Title);
foreach (var item in feed.Items)
{
Console.WriteLine($"{item.Published:g}\t{item.Title}");
Console.WriteLine(item.Link);
}Note: Feed
SummaryandContentfields may contain HTML. Sanitize before rendering in a UI.
builder.Services.AddSimpleRss(options => options with { MaxConcurrentRequests = 8 });
public class FeedService(FeedReader reader)
{
public Task<Feed> LoadAsync(string url) => reader.GetFeedAsync(url);
}Response caching is opt-in when using dependency injection:
builder.Services.AddSimpleRss(options => options with { EnableResponseCache = true });var feed = FeedReader.Parse(File.ReadAllText("feed.xml"));
await using var stream = File.OpenRead("feed.xml");
var feedFromStream = await FeedReader.ParseAsync(stream);GetFeedsAsync returns per-feed results and supports partial success:
using var reader = new FeedReader();
var results = await reader.GetFeedsAsync([
"https://example.com/feed-a.rss",
"https://example.com/feed-b.rss"
]);
foreach (var result in results.Where(result => result.IsSuccess))
{
Console.WriteLine(result.Feed!.Title);
}Combine items across feeds:
using var reader = new FeedReader(new FeedReaderOptions
{
InterleaveMultipleFeeds = true
});
var items = await reader.GetCombinedItemsAsync([
"https://example.com/feed-a.rss",
"https://example.com/feed-b.rss"
]);using var discovery = new FeedDiscovery(new HttpClient());
var feedUrl = await discovery.DiscoverFeedUrlAsync("https://example.com/blog");
using var reader = new FeedReader();
var feed = await reader.DiscoverAndGetFeedAsync("https://example.com/blog");var cache = new InMemoryFeedResponseCache();
using var reader = new FeedReader(new FeedReaderOptions
{
ResponseCache = cache
});
var feed = await reader.GetFeedAsync("https://example.com/feed.rss");- RSS 2.0
- Atom 1.0
- RSS 1.0 / RDF
Apache-2.0 — see LICENSE.