c# - 在 .NET Web 应用程序中生成的 XML 文件在本地工作,但内容在生产中为空

标签 c# .net .net-7.0

我有一个 .NET 7 网络应用程序,其中有一个生成 sitemap.xml 文件的 Controller 。当我在本地运行该应用程序时,我得到一个包含以下内容的 XML 文件:

<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"/>

它看起来像这样:

enter image description here

但是,当它被推送到生产环境时(一切都作为 Azure 上的 Web 应用程序托管),相同的端点不返回任何内容。它确实识别端点并且看起来像这样:

enter image description here

我生成此代码的代码如下所示:

    [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。这是结果:

enter image description here

如果你确实想手动做,你可以做以下

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/

相关文章:

c# - 在 C# 中格式化 HTML 中的异常以通过电子邮件发送给 SysAdmin

c# - 有效地从多行字符串中删除所有空白行

c# - 如果需要使用启动项目,如何在使用 Clean Architecture 的同时创建 EF Core 迁移?

c# - Azure TimerTrigger 无法在 .NET 7 独立工作进程中工作

C# 进行并发 HTTP 调用

c# - 为什么我无法调试动态加载的程序集?

c# - 将带小数的数字(货币)转换为单词

c# - 在 Visual Studio v.09 中使用 C#/.NET 的 Qt?

c# - 如何继续将整数添加到列表中,同时查看这些整数是否已经在列表中?

c# - 如何判断您的页面是否在 .Net 中的 iFrame 中运行?