.NET 7+的Minimal APIs如何定义XML上传端点

9次阅读

Minimal APIs 默认不支持 xml 请求体解析,需手动注册 XmlSerializerInputFormatter 并添加 microsoft.As.netCore.mvc.Formatters.Xml 包;模型须用 [XmlRoot] 等标记且含无参构造函数,Content-Type 必须严格为 application/xml 或 text/xml。

.NET 7+的Minimal APIs如何定义XML上传端点

Minimal APIs 默认不支持 XML 请求体解析

Minimal APIs 在 .NET 7+ 中默认只注册了 application/jsontext/plain 的输入格式化器(InputFormatter),遇到 application/xmltext/xml 会直接返回 415 Unsupported Media Type。这不是路由或模型绑定写错了,而是底层没启用 XML 支持。

必须手动注册 XmlSerializerInputFormatter

要让 Minimal API 接收 XML 请求体,得在 Program.cs 中显式添加 XML 输入格式化器,并指定它处理哪些 MIME 类型。注意:.NET 7+ 默认用的是 XmlSerializer,不是 DataContractSerializer,所以模型类需用 [XmlRoot][XmlElement] 等标记,且必须有无参构造函数。

  • 安装 NuGet 包:Microsoft.AspNetCore.Mvc.Formatters.Xml
  • 调用 AddXmlSerializerFormatters()(不是 AddXmlDataContractSerializerFormatters
  • 该方法会注册 application/xmltext/xmlapplication/soap+xml
var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); // 必须加,Minimal API 的 XML 支持依赖 MVC 服务 builder.Services.AddXmlSerializerFormatters();  var app = builder.Build(); app.MapControllers(); // 启用控制器风格的端点(含 ModelBinding) app.Run();

定义 XML 上传端点要用 MapPost + FromBody

Minimal API 的 MapPost 本身不支持自动绑定 XML,必须配合 MVC 的控制器机制或显式使用 FromBody —— 但后者在纯 Minimal API 路由中不可用。最稳妥做法是改用控制器风格端点,或在 MapPost 中手动读取原始流再反序列化。

  • 推荐方式:用控制器(更清晰、复用已有绑定逻辑)
  • 若坚持 Minimal API 风格:用 HttpContext.Request.Body 读取字节流,再用 XmlSerializer.Deserialize() 手动解析
  • 不要尝试给 MapPost 参数加 [FromBody] —— 它在 Minimal API 路由中无效
[ApiController] [Route("api/[controller]")] public class XmlUploadController : ControllerBase {     [HttpPost("upload")]     public IActionResult Upload([FromBody] Person person)     {         if (person == null) return BadRequest();         return Ok(new { Received = person.Name });     } }  // 对应的 XML 示例请求体: //  //   Alice // 

常见失败原因和绕过陷阱

即使注册了 XML 格式化器,仍可能 400 或 415,关键检查点:

  • 请求头 Content-Type 必须严格为 application/xmltext/xml(大小写敏感,不能带参数如 charset=utf-8
  • 模型类字段名与 XML 元素名不匹配时,必须用 [XmlElement("xxx")] 显式声明,不能依赖默认命名规则
  • XmlSerializer 不支持 Dictionary 直接映射,需封装为数组或自定义类型
  • 如果用了 System.Text.json 的属性标记(如 [JsonPropertyName]),对 XML 绑定完全无效

XML 上传看似简单,但实际卡点都在 MIME 类型注册时机、序列化器选型、以及模型标记的精确性上——漏掉任一环都会静默失败或返回空对象

text=ZqhQzanResources