我们正在将 .NET 2.2 应用迁移到 .NET 6,但我们遇到了一个问题:一些向我们的系统发出请求但未指定 Accept
HTTP header 的第三方应用会返回.NET 2.2 中默认使用 JSON 数据,但现在在未指定任何内容的情况下它们会获取 XML。
如果我运行相同的请求,但将 Accept
指定为 application/json
,我会返回 JSON。
我们的应用程序以 JSON 形式返回 99% 的结果,但有一个返回 XML 的特定 SOAP 端点(它与另一个 SOAP Web 服务通信并在此单个端点上返回 SOAP)。
配置是:
services.AddSoapCore();
services
.AddMvc()
.AddXmlSerializerFormatters()
.AddNewtonsoftJson(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()));
如果我删除 AddXmlSerializerFormatters()
,端点会正确返回 JSON,但 SOAP 端点会停止工作。
我知道我可以使用 [Produces]
属性,但理想情况下我们会保持相同的默认行为,而不必手动遍历所有端点。
有没有办法将应用程序配置为在未指定任何内容时默认返回 JSON,而不删除 XML 支持?
最佳答案
Asp.NET Core 按优先级选择已注册的格式化程序,并且它们添加的顺序将成为它们的优先级。因此,当您首先添加 XML 格式化程序时,当请求中没有出现 Accept header 时,第一个匹配的格式化程序将是 XML 格式化程序。只需先添加 JSON 格式化程序即可。
我重现了该问题并首先添加了 JSON 格式化程序,成功解决了问题
builder.Services
.AddMvc()
.AddNewtonsoftJson(options => options.SerializerSettings.Converters.Add(new StringEnumConverter()))
.AddXmlSerializerFormatters();
关于json - ASP.NET Core .NET 6 应用程序默认返回 XML 而不是 JSON,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72570575/