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

Minimal APIs 默认不支持 XML 请求体解析
Minimal APIs 在 .NET 7+ 中默认只注册了 application/json 和 text/plain 的输入格式化器(InputFormatter),遇到 application/xml 或 text/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/xml、text/xml和application/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/xml或text/xml(大小写敏感,不能带参数如charset=utf-8) - 模型类字段名与 XML 元素名不匹配时,必须用
[XmlElement("xxx")]显式声明,不能依赖默认命名规则 -
XmlSerializer不支持Dictionary直接映射,需封装为数组或自定义类型 - 如果用了
System.Text.Json的属性标记(如[JsonPropertyName]),对 XML 绑定完全无效
XML 上传看似简单,但实际卡点都在 MIME 类型注册时机、序列化器选型、以及模型标记的精确性上——漏掉任一环都会静默失败或返回空对象。










