如何修改ASP.NET Core 6.0 Web API默认响应Content-Type不含charset?
解决ASP.NET Core 6.0 Web API响应Content-Type带charset的问题
你的ASP.NET Core 6.0 Web API实现了幂等层做请求缓存重放,但默认响应的Content-Type是application/json; charset=utf-8,导致重放时无法匹配SystemTextJsonOutputFormatter(它只识别application/json)。你之前的临时方案是给格式化器添加带charset的媒体类型,但这不是根治办法,以下是彻底解决的方法:
根治方案:禁用格式化器的Charset输出
SystemTextJsonOutputFormatter继承自TextOutputFormatter,后者的UseCharset属性默认是true——这就是响应自动带charset=utf-8的原因。只要把这个属性设为false,就能让响应的Content-Type只保留application/json:
builder.Services.AddControllers(options => { var jsonFormatter = options.OutputFormatters .OfType<SystemTextJsonOutputFormatter>() .FirstOrDefault(); if (jsonFormatter != null) { // 关闭自动添加charset后缀 jsonFormatter.UseCharset = false; } });
这么设置后,后续所有JSON响应的Content-Type都会是标准的application/json,完全符合SystemTextJsonOutputFormatter的识别规则,幂等层重放时就不会再出现匹配失败的问题。
为什么临时方案不是根治?
你之前给格式化器添加application/json; charset=utf-8到支持列表,只是让格式化器能兼容带charset的响应,但并没有从根源上阻止响应生成带charset的头——新的响应依然会带这个后缀,后续可能还会遇到其他兼容性问题。而禁用UseCharset是从源头切断charset的生成,彻底解决问题。
内容的提问来源于stack exchange,提问作者Tree Gold
相关产品推荐
相关产品推荐

