예제 #1
0
        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);
        }
예제 #2
0
    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);
    }