【问题标题】:Serving dynamic sitemap.xml content提供动态 sitemap.xml 内容
【发布时间】:2020-01-17 22:41:42
【问题描述】:

如何从 ASP.NET Core 3.1 提供动态 sitemap.xml 文件?

我尝试了类似的方法:

...
public ActionResult SiteMap()
{
    // logic here
    return Content("<sitemap>...</sitemap>", "text/xml");
}
...

【问题讨论】:

  • 在这种情况下,让外部进程每天生成一次 sitemap.xml 文件然后将其放入根网站文件夹中通常很不错,这样您的代码就不必知道或关心它。如何抓取/索引/管理站点地图取决于您。

标签: c# xml asp.net-core asp.net-core-3.1 xml-sitemap


【解决方案1】:

是的,这正是正确的方法。当然,假设您使用的是standard sitemap protocol,您需要:

  1. 建立 XML 声明(例如,&lt;?xml version="1.0" encoding="UTF-8"?&gt;
  2. &lt;urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" /&gt; 元素开头

因此,例如,如果您想使用 XDocument 组装您的 XML,您可以从以下内容开始:

private static readonly XNamespace _sitemapNamespace = "http://www.sitemaps.org/schemas/sitemap/0.9";
private static readonly XNamespace _pagemapNamespace = "http://www.google.com/schemas/sitemap-pagemap/1.0";

public ActionResult Sitemap() {
  var xml = new XDocument(
    new XDeclaration("1.0", "utf-8", String.Empty),
    new XElement(_sitemapNamespace + "urlset",
      //Your logic here
    )
  return Content(sitemap.ToString(), "text/xml");
  );
}

也就是说,使用此代码,您会遇到一个问题,即您的 XML 声明没有随 XML 返回,因为XDocument.ToString() 只返回一个 XML sn-p。要解决此问题,您需要将 XDocument 包装在例如StringWriter:

var sitemapFile = new StringBuilder();
using (var writer = new StringWriter(sitemapFile)) {
  sitemap.Save(writer);
}
return Content(sitemapFile.ToString(), "text/xml");

注意:显然还有其他方法可以动态生成 XML。如果您使用XmlWriterXmlDocument,您的代码看起来会大不相同。重点是帮助填写实际实现可能的样子,而不是规定一种排他性的方法。

您的尝试是否遇到了具体问题?如果是这样,我也许能够提供更具体的指导。但是,照原样,您采取的方法是正确的。

【讨论】:

  • 除此之外,我的一个项目有一个SitemapController,如果有用,您可以参考。也就是说,该逻辑高度特定于我们的 CMS,并且您可能不关心很多 structured metadata。不过,它演示了一种动态组装XDocument 并通过Content(xml, "text/xml") 返回它的方法。
  • 当我尝试调用它时得到一个 404,我不确定为什么。我确实尝试向它添加路由:... endpoints.MapControllerRoute( name: "Sitemap", pattern: "/{page?}/{id?}", defaults: new { controller = "Home", Action = "站点地图", 语言 = "da" }); ...
  • 我的代码看起来像这样 public ActionResult Sitemap() { // 这里的逻辑 StringBuilder sb = new StringBuilder(); sb.Append(""); sb.Append("sitemaps.org/schemas/sitemap/0.9\">"); sb.Append(""); sb.Append(">example.com/</loc>"); sb.Append(""); sb.Append(""); return Content(sb.ToString(), "text/ xml"); }
  • @Amigo:您的 404 很可能是由于路由问题,而不是您的 Sitemap() 操作的特定错误。您上面列出的路由的一个潜在问题是它提供了一个非常通用的pattern,它可能会被另一个端点取代。假设您只打算拥有一个主站点地图,我会考虑在您的控制器中添加一个 [Route("Sitemap")] 属性。或者,如果您想维护特定于站点地图的路线,我会将您的模式更改为例如Sitemap。请注意,当前 pattern 中的前导 / 也可能会导致问题。
  • 冷却它的工作,我的路线不正确。我将模式更改为“站点地图”,一切都很好。非常感谢您帮助 Jeremy (y)
猜你喜欢
  • 2012-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多