public async Task <string> BuildRSSFeed(RSSFeedOptions rssOptions) { if (rssOptions == null) { throw new ArgumentNullException(nameof(rssOptions)); } if (string.IsNullOrEmpty(rssOptions.Title)) { throw new ArgumentNullException(nameof(rssOptions.Title)); } return(await _memoryCache.GetOrCreateAsync(rssOptions.Caching?.Key ?? "RSSCache", async caching => { caching.SetAbsoluteExpiration(rssOptions.Caching?.CacheDuration ?? TimeSpan.FromDays(1)); return await BuildRSSFeedInternal(rssOptions); })); }
private async Task <string> BuildRSSFeedInternal(RSSFeedOptions rssOptions) { var sb = new StringBuilder(); using (var _ = new StringWriter(sb)) using (XmlWriter xmlWriter = XmlWriter.Create(_, new XmlWriterSettings { Async = true, Indent = true })) { //Since the XmlWriter doesn't care about actually setting UTF-8, let's just do it manually await xmlWriter.WriteProcessingInstructionAsync("xml", @"version=""1.0"" encoding=""UTF-8"""); var syndicationFeedWriter = new RssFeedWriter(xmlWriter); await syndicationFeedWriter.WriteTitle(rssOptions.Title).ConfigureAwait(false); if (!string.IsNullOrEmpty(rssOptions.Description)) { await syndicationFeedWriter.WriteDescription(rssOptions.Description).ConfigureAwait(false); } if (rssOptions.Url != null) { await syndicationFeedWriter.Write(new SyndicationLink(rssOptions.Url)).ConfigureAwait(false); if (rssOptions.ImageUrl != null) { await syndicationFeedWriter.Write(new SyndicationImage(rssOptions.ImageUrl) { Title = rssOptions.Title, Link = new SyndicationLink(rssOptions.Url) }).ConfigureAwait(false); } } //Choose the current culture if no language has been chosen await syndicationFeedWriter.WriteLanguage(rssOptions.Language ?? CultureInfo.CurrentCulture).ConfigureAwait(false); if (!string.IsNullOrEmpty(rssOptions.ManagingEditor)) { await syndicationFeedWriter.Write(new SyndicationPerson(null, rssOptions.ManagingEditor, RssContributorTypes.ManagingEditor)).ConfigureAwait(false); } //Do we even still care about Webmaster? if (!string.IsNullOrEmpty(rssOptions.Webmaster)) { await syndicationFeedWriter.WriteValue("webMaster", rssOptions.Webmaster).ConfigureAwait(false); } if (!string.IsNullOrEmpty(rssOptions.Copyright)) { await syndicationFeedWriter.WriteCopyright(rssOptions.Copyright).ConfigureAwait(false); } var syndicationItems = await _rssProvider.RetrieveSyndicationItems().ConfigureAwait(false); //Use the latest LastUpdated item in the list to determine the last build date. await syndicationFeedWriter.WriteLastBuildDate(syndicationItems.Max(x => x.LastUpdated)).ConfigureAwait(false); foreach (var __ in syndicationItems) { await syndicationFeedWriter.Write(__.ToSyndicationItem()).ConfigureAwait(false); } await xmlWriter.FlushAsync().ConfigureAwait(false); } return(sb.ToString()); }
public static IApplicationBuilder UseRSSFeed(this IApplicationBuilder builder, string path, RSSFeedOptions options) { return(builder.UseWhen(context => context.Request.Path.Value.ToLower() == path, config => { config.UseMiddleware <RSSMiddleware>(path, options); })); }
public RSSMiddleware(RequestDelegate next, string urlPath, RSSFeedOptions rssOptions) { _next = next ?? throw new ArgumentNullException(nameof(next)); _urlPath = urlPath ?? throw new ArgumentNullException(nameof(urlPath)); _rssOptions = rssOptions; }