ASP.NET Core如何返回XML格式的API响应

ASP.NET Core 默认不支持 XML 响应,需在 Program.cs 中调用 AddXmlSerializerFormatters() 注册,并在控制器方法添加 [Produces("application/xml")] 特性,客户端请求头需含 Accept: application/xml。

ASP.NET Core 默认不启用 XML 响应支持,需手动配置才能让 API 返回 XML 格式(如 application/xml),尤其在对接传统系统或满足特定协议要求时很有用。

启用 XML 输出格式化器

Program.cs 中注册 XML 支持:

  • 调用 AddXmlSerializerFormatters()AddXmlDataContractSerializerFormatters()
  • 前者基于 XmlSerializer,更常用;后者基于 DataContractSerializer,适合 WCF 兼容场景

示例(.NET 6+):

builder.Services.AddControllers()
    .AddXmlSerializerFormatters(); // 启用 XmlSerializer 支持

控制器返回 XML 响应

确保控制器方法返回可序列化的对象(如 POCO 类),并添加 [Produces("application/xml")] 特性声明输出类型:

[ApiController]
[Route("api/[controller]")]
public class ProductsController : ControllerBase
{
    [HttpGet]
    [Produces("application/xml")]
    public IActionResult Get() => Ok(new Product { Id = 1, Name = "Laptop" });
}

客户端需在请求头中指定 Accept: application/xml,否则仍可能返回 JSON(取决于内容协商结果)。

注意序列化行为和兼容性

XmlSerializer 对类成员有要求:

  • 只序列化 公共读写属性(字段不支持)
  • 类必须有无参构造函数
  • 若需自定义 XML 节点名或忽略某属性,可用 [XmlElement("CustomName")][XmlIgnore]

例如:

public class Product
{
    public int Id { get; set; }
    [XmlElement("ProductName")]
    public string Name { get; set; }
    [XmlIgnore]
    public DateTime CreatedAt { get; set; }
}

调试与验证

使用 curl 或 Postman 测试时,务必设置 Accept 请求头:

curl -H "Accept: application/xml" https://localhost:5001/api/products

若返回 406 Not Acceptable,检查是否遗漏注册 XML 格式化器,或控制器未正确标注 [Produces],或返回对象不可被 XmlSerializer 处理。