You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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序列化配置,不需要手动处理反序列化逻辑

  1. 服务注册阶段添加如下配置:
// 注册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>();
  1. 接口定义保持你原来的写法即可正常解析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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 12:36:04