Example #1
0
        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);
            }));
        }
Example #2
0
        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());
        }
Example #3
0
 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);
     }));
 }
Example #4
0
 public RSSMiddleware(RequestDelegate next, string urlPath, RSSFeedOptions rssOptions)
 {
     _next       = next ?? throw new ArgumentNullException(nameof(next));
     _urlPath    = urlPath ?? throw new ArgumentNullException(nameof(urlPath));
     _rssOptions = rssOptions;
 }