.NET 6 Minimal API 配置XML格式化器返回415状态码问题咨询
问题原因
.NET 6 原生的 Minimal API 默认仅内置了 JSON 序列化支持,你之前调用的AddXmlSerializerFormatters()是面向 MVC 控制器体系的扩展方法,对 Minimal API 的参数绑定逻辑不生效。你添加的Accepts<Request>("text/xml")仅会作用于接口文档的标识,不会修改实际的请求体解析逻辑,所以收到XML请求时会直接抛出415错误。
可用解决方案
这里提供两种可落地的实现方式:
方式一:复用MVC的XML格式化器(推荐)
该方式可以复用MVC体系成熟的XML序列化配置,不需要手动处理反序列化逻辑
- 服务注册阶段添加如下配置:
// 注册MVC核心服务及XML序列化格式化器 builder.Services.AddMvcCore().AddXmlSerializerFormatters(); // 实现适配Minimal API的XML请求体读取器 public class XmlSerializerRequestBodyReader : IHttpRequestBodyReader { public async ValueTask<object?> ReadAsync(HttpRequest request, Type type, IReadOnlyDictionary<string, object?> parameters, CancellationToken cancellationToken) { var serializer = new XmlSerializer(type); return serializer.Deserialize(request.Body); } } // 注册自定义的XML请求体读取器 builder.Services.AddSingleton<IHttpRequestBodyReader, XmlSerializerRequestBodyReader>();
- 接口定义保持你原来的写法即可正常解析XML请求:
app.MapPost("/endpoint", ([FromBody] Request request) => { // 业务逻辑 }) .Accepts<Request>("text/xml");
方式二:手动处理请求体反序列化
如果不想引入MVC相关服务,可以直接在接口逻辑里手动读取请求体做XML反序列化:
app.MapPost("/endpoint", async (HttpRequest request) => { using var reader = new StreamReader(request.Body); var xmlContent = await reader.ReadToEndAsync(); var serializer = new XmlSerializer(typeof(Request)); using var stringReader = new StringReader(xmlContent); var requestObj = (Request)serializer.Deserialize(stringReader)!; // 业务逻辑 }) .Accepts<Request>("text/xml");
内容的提问来源于stack exchange,提问作者AndrejT
相关产品推荐
相关产品推荐

