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

ASP.NET Core Web API返回406状态码:XML响应格式异常求助

解决ASP.NET Core Web API XML响应返回406状态码的问题

你遇到的核心问题是多次调用AddControllers()导致XML格式化器被覆盖。每次调用AddControllers()都会生成一个全新的IMvcBuilder实例,之前配置的AddXmlSerializerFormatters()会被后续的配置完全覆盖,系统找不到XML格式的输出处理器,请求XML时自然返回406(无法接受)状态码。

修正后的Startup配置

把所有控制器配置合并为一次链式调用,确保XML格式化器和NewtonsoftJson配置同时生效:

services.AddControllers(options => {
    // 移除不需要的输出格式化器
    options.OutputFormatters.RemoveType<StringOutputFormatter>();
    options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
})
.AddXmlSerializerFormatters() // 添加XML序列化格式化器
.AddNewtonsoftJson(options => {
    // 保留PascalCase属性命名规则
    options.SerializerSettings.ContractResolver = new DefaultContractResolver();
});

为什么这样修改?

原来的代码中你连续调用了四次AddControllers(),每一次都会重置之前的配置逻辑。比如第一次添加了XML格式化器,但第二次调用AddControllers().AddNewtonsoftJson()就完全覆盖了前序配置,XML格式化器也就丢失了。链式调用能让所有配置都应用到同一个IMvcBuilder实例上,保证XML和JSON格式化器同时生效。

验证请求方式

你的Controller路由和FormatFilter配置是正确的,请求时需要指定格式参数为xml,比如:

GET /api/Table/values.xml

也可以通过设置Accept请求头为application/xml来请求XML响应,即使不使用{format}路由参数也能生效(当前路由已支持格式后缀,两种方式都可行)。

额外检查点

确保你的Table类满足XML序列化要求:

  • 类必须包含无参构造函数(XML序列化器依赖此构造函数)
  • 需要序列化的公共属性应为可读可写状态

内容的提问来源于stack exchange,提问作者E.Lahu

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 09:07:55