我有一个 .NET 7 网络应用程序,其中有一个生成 sitemap.xml
文件的 Controller 。当我在本地运行该应用程序时,我得到一个包含以下内容的 XML 文件:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"/>
它看起来像这样:
但是,当它被推送到生产环境时(一切都作为 Azure 上的 Web 应用程序托管),相同的端点不返回任何内容。它确实识别端点并且看起来像这样:
我生成此代码的代码如下所示:
[Route("/sitemap.xml")]
public async Task SitemapXml()
{
var countries = await _countryService.GetBySpecificationAsync(new CountrySpecification()
{
Take = int.MaxValue
});
Response.ContentType = "application/xml";
using (var xml = XmlWriter.Create(Response.Body, new XmlWriterSettings { Indent = true }))
{
xml.WriteStartDocument();
xml.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9");
xml.WriteEndElement();
}
}
我的问题: 我完全迷路了。起初我以为是因为我没有添加对静态文件的支持,这被认为是静态文件,但我确实有:
app.UseStaticFiles();
在 Program.cs
中。
我应该从哪里开始的任何提示?
最佳答案
这周我花了一些时间想回答这个问题,现在我有时间了。
您尝试的主要问题是您没有返回 XML 结果。为此,我建议使用 IActionResult
接口(interface)。
现在是创建 sitemap.xml
的时候了。 IMO 从这里开始有 2 种方法,要么使用库,要么编写您自己的站点地图方法。
我将从图书馆开始。例如,有一个名为 SimpleMvcSitemap.Core
的非常简单的库 (NuGet)。在您的项目中安装它,并在您的 Controller 中插入以下代码:
[Route("/sitemap.xml")]
public async Task<IActionResult> SitemapXml()
{
// your await call etc
List<SitemapNode> nodes = new List<SitemapNode>
{
new SitemapNode(Url.Action("Index","Home")),
new SitemapNode(Url.Action("About","Home")),
//other nodes
};
return new SitemapProvider().CreateSitemap(new SitemapModel(nodes));
}
顺便说一句,对于这个测试,我创建了一个 asp.net MVC .net 7 项目。
我已将解决方案部署到 azure,它既适用于本地开发,也适用于 azure。这是结果:
如果你确实想手动做,你可以做以下
var listUrls = new List<string>
{
Url.Action("Index", "Home"),
Url.Action("About", "Home")
};
return new SitemapResult(listUrls);
下面是实现:
public class SitemapResult : ActionResult
{
private readonly IEnumerable<string> _urls;
public SitemapResult(IEnumerable<string> urls)
{
_urls = urls;
}
public override async Task ExecuteResultAsync(ActionContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var response = context.HttpContext.Response;
response.ContentType = "application/xml; charset=utf-8";
var settings = new XmlWriterSettings() { Async = true, Encoding = Encoding.UTF8, Indent = false };
using (var writer = XmlWriter.Create(response.Body, settings))
{
WriteToXML(writer);
await writer.FlushAsync();
}
}
private void WriteToXML(XmlWriter writer)
{
writer.WriteStartDocument();
// Write the urlset.
writer.WriteStartElement("urlset", "http://www.sitemaps.org/schemas/sitemap/0.9");
// url element
foreach (var item in _urls)
{
writer.WriteStartElement("url");
// loc
writer.WriteStartElement("loc");
writer.WriteValue(item);
writer.WriteEndElement();
writer.WriteEndElement();
}
writer.WriteEndElement();
writer.WriteEndDocument();
}
}
手动方式也部署在 azure 上并且可以工作,但是以手动方式您需要做很多已经在库中完成的工作。公平地说,以上两个结果都受到问题 How to dynamically create a sitemap.xml in .NET core 2? 的启发。 .
关于c# - 在 .NET Web 应用程序中生成的 XML 文件在本地工作,但内容在生产中为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75033786/