从 ASP .NET Core Web API 方法返回完整的 XML 响应

Bel*_*fed 3 c# xml api model-view-controller asp.net-core

我正在利用客户关于 Web 服务的请求来处理 ASP.NET Core。

该请求是一个返回数据XML格式的 Web 方法,如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<Person>
  <Name>John</Name>
  <Surname>Doe</Surname>
  . . .
</Person>
Run Code Online (Sandbox Code Playgroud)

我可以让 Web 服务text/xml按请求返回数据,并在ConfigureServices内部方法中强制返回数据Startup.cs,如下所示:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddMvc(options =>
    {
        options.Filters.Add(new ProducesAttribute("text/xml"));
    }).AddXmlSerializerFormatters();
}
Run Code Online (Sandbox Code Playgroud)

问题是,当我调用应该返回数据的方法时,我没有客户出于某种原因所需的 XML 声明标头:

<?xml version="1.0" encoding="UTF-8"?>
Run Code Online (Sandbox Code Playgroud)

这是结果:

<Person xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <Name>John</Name>
    <Surname>Doe</Surname>
</Person>
Run Code Online (Sandbox Code Playgroud)

方法如下:

[HttpGet("getperson")]
public Person GetPerson()
{
    return new Person 
    {
        Name = "John",
        Surname = "Doe",
    };        
}
Run Code Online (Sandbox Code Playgroud)

这里是班级Person:

public class Person
{
    public string Name { get; set; }
    public string Surname { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我研究了很多,但我发现的一切对我没有任何帮助。我想使用框架的功能序列化我的类,而不必逐个节点构建 XML 结构,因此我希望服务内的某些设置允许我这样做。

如有必要,可以对方法进行任何更改GetPerson,这只是一个非常简化的测试。

预先感谢您的帮助!

Tea*_*rth 6

您需要像这样配置 XML 输出格式化程序:

public void ConfigureServices(IServiceCollection services)
{
    services.AddControllers();
    services.AddMvc(options =>
    {
        options.Filters.Add(new ProducesAttribute("text/xml"));
        options.OutputFormatters.Add(new XmlSerializerOutputFormatter(new XmlWriterSettings
        {
            OmitXmlDeclaration = false
        }));
    }).AddXmlSerializerFormatters();
}
Run Code Online (Sandbox Code Playgroud)

示例输出:

<?xml version="1.0" encoding="utf-8"?>
<ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
    <string>value1</string>
    <string>value2</string>
</ArrayOfString>
Run Code Online (Sandbox Code Playgroud)