ASP.NET Core .NET6未指定Accept头默认返回XML而非JSON如何解决
.NET 6无Accept头时默认返回JSON配置方案
问题原因
出现该问题的核心原因是输出格式化器的注册顺序:调用AddXmlSerializerFormatters()时,会将XML序列化器插入到MVC输出格式化器列表的靠前位置,而.NET 6的内容协商逻辑在请求未携带Accept头、或Accept头为通配符*/*时,会优先选择格式化器列表中第一个可处理返回类型的格式化器,因此默认返回了XML。.NET 2.2中默认JSON格式化器优先级高于XML,因此不会出现该问题。
实现方案
不需要移除XML格式化器支持,也不需要逐个给接口添加[Produces]特性,只需要调整MVC输出格式化器的优先级,将JSON格式化器放到列表首位即可,SOAP端点走SoapCore独立处理管道,不会受该配置影响。
修改服务配置代码如下:
services.AddSoapCore(); services .AddMvc() .AddXmlSerializerFormatters() .AddNewtonsoftJson(options => options.SerializerSettings.Converters.Add(new StringEnumConverter())); // 所有格式化器注册完成后,调整JSON格式化器优先级 services.Configure<MvcOptions>(options => { // 将NewtonsoftJson格式化器移动到输出格式化器列表最首位,作为无Accept头时的默认返回格式 var jsonOutputFormatter = options.OutputFormatters.OfType<NewtonsoftJsonOutputFormatter>().First(); options.OutputFormatters.Remove(jsonOutputFormatter); options.OutputFormatters.Insert(0, jsonOutputFormatter); // 兼容浏览器发起的Accept头为*/*的请求,同样默认返回JSON options.RespectBrowserAcceptHeader = false; });
配置说明
- 调整顺序后,显式指定
Accept: application/xml的请求依然可以正常返回XML格式,不影响原有XML格式支持能力 - SoapCore的SOAP端点不依赖MVC默认内容协商逻辑,配置调整后可正常工作
- 配置全局生效,所有未指定Accept头的普通接口都会默认返回JSON,和.NET 2.2的行为完全一致
内容的提问来源于stack exchange,提问作者vgru
相关产品推荐
相关产品推荐

