public async Task <string> GetSiteMapData(string siteRootUrl) { var sb = new StringBuilder(); var writerSettings = new XmlWriterSettings { Encoding = Encoding.UTF8, Async = true }; await using (var writer = XmlWriter.Create(sb, writerSettings)) { await writer.WriteStartDocumentAsync(); writer.WriteStartElement("urlset", _settings.SiteMap.UrlSetNamespace); // Posts var spec = new PostSitePageSpec(); var posts = await _postRepo.SelectAsync(spec, p => new { p.Slug, p.PubDateUtc }); foreach (var item in posts.OrderByDescending(p => p.PubDateUtc)) { var pubDate = item.PubDateUtc.GetValueOrDefault(); writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/post/{pubDate.Year}/{pubDate.Month}/{pubDate.Day}/{item.Slug.ToLower()}"); writer.WriteElementString("lastmod", pubDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", _settings.SiteMap.ChangeFreq["Posts"]); await writer.WriteEndElementAsync(); } // Pages var pages = await _pageRepo.SelectAsync(page => new { page.CreateTimeUtc, page.Slug, page.IsPublished }); foreach (var item in pages.Where(p => p.IsPublished)) { writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/page/{item.Slug.ToLower()}"); writer.WriteElementString("lastmod", item.CreateTimeUtc.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", _settings.SiteMap.ChangeFreq["Pages"]); await writer.WriteEndElementAsync(); } // Tag writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/tags"); writer.WriteElementString("lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", _settings.SiteMap.ChangeFreq["Default"]); await writer.WriteEndElementAsync(); // Archive writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/archive"); writer.WriteElementString("lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", _settings.SiteMap.ChangeFreq["Default"]); await writer.WriteEndElementAsync(); await writer.WriteEndElementAsync(); } var xml = sb.ToString(); return(xml); }
private static async Task <string> GetSiteMapData( string siteRootUrl, IConfiguration siteMapSection, IRepository <PostEntity> postRepo, IRepository <PageEntity> pageRepo) { var sb = new StringBuilder(); var writerSettings = new XmlWriterSettings { Encoding = Encoding.UTF8, Async = true }; await using (var writer = XmlWriter.Create(sb, writerSettings)) { await writer.WriteStartDocumentAsync(); writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9"); // Posts var spec = new PostSitePageSpec(); var posts = await postRepo.SelectAsync(spec, p => new Tuple <string, DateTime?>(p.Slug, p.PubDateUtc)); foreach (var(slug, pubDateUtc) in posts.OrderByDescending(p => p.Item2)) { var pubDate = pubDateUtc.GetValueOrDefault(); writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/post/{pubDate.Year}/{pubDate.Month}/{pubDate.Day}/{slug.ToLower()}"); writer.WriteElementString("lastmod", pubDate.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", siteMapSection["ChangeFreq:Posts"]); await writer.WriteEndElementAsync(); } // Pages var pages = await pageRepo.SelectAsync(page => new Tuple <DateTime, string, bool>( page.CreateTimeUtc, page.Slug, page.IsPublished) ); foreach (var(createdTimeUtc, slug, isPublished) in pages.Where(p => p.Item3)) { writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/page/{slug.ToLower()}"); writer.WriteElementString("lastmod", createdTimeUtc.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", siteMapSection["ChangeFreq:Pages"]); await writer.WriteEndElementAsync(); } // Tag writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/tags"); writer.WriteElementString("lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", siteMapSection["ChangeFreq:Default"]); await writer.WriteEndElementAsync(); // Archive writer.WriteStartElement("url"); writer.WriteElementString("loc", $"{siteRootUrl}/archive"); writer.WriteElementString("lastmod", DateTime.UtcNow.ToString("yyyy-MM-dd", CultureInfo.InvariantCulture)); writer.WriteElementString("changefreq", siteMapSection["ChangeFreq:Default"]); await writer.WriteEndElementAsync(); await writer.WriteEndElementAsync(); } var xml = sb.ToString(); return(xml); }