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
相关产品推荐
相关产品推荐

