.NET 4.7 WebAPI无法反序列化JSON负载,Swagger却可正常运行
问题排查与解决方案
1. 排查JSON序列化器配置或版本变更
.NET 4.7 WebAPI默认依赖Newtonsoft.Json(Json.NET),若服务器近期更新了框架补丁或NuGet包,可能导致序列化规则变动:
- 检查
Newtonsoft.Json版本是否在3月10日前后有更新,回退至之前的稳定版本测试。 - 确认序列化器的大小写匹配规则:早期Json.NET默认启用驼峰匹配,但如果配置被修改为严格大小写匹配,会导致
name无法映射到Name、b64Payload无法映射到B64Payload。
修复方案:显式配置JSON序列化规则
在WebApiConfig.cs中添加或确认以下配置,确保大小写不敏感匹配:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver(); config.Formatters.JsonFormatter.SerializerSettings.MissingMemberHandling = MissingMemberHandling.Ignore;
2. 检查请求的Content-Type头
若客户端发送请求时未指定Content-Type: application/json,WebAPI的JSON格式化器会忽略请求体,导致[FromBody]参数为null:
- 用抓包工具(如Fiddler)或日志确认请求头的
Content-Type是否为application/json; charset=utf-8。 - 注:Swagger会自动添加正确的Content-Type,因此能正常处理导出的内容。
修复方案:强制客户端设置正确头,或服务器端兼容处理
若无法修改客户端,可在WebAPI中添加对text/plain类型的JSON解析支持:
config.Formatters.JsonFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("text/plain"));
3. 为模型添加显式JSON序列化特性(长期稳定方案)
当前模型仅配置了Xml序列化特性,依赖序列化器默认行为,版本变动时易出问题。添加JsonProperty特性明确字段映射关系:
[XmlType(AnonymousType = true, Namespace = "http://dataprocessor.com/payload")] public class DataReq { [XmlElement(Form = XmlSchemaForm.Unqualified)] [JsonProperty("name")] public string Name { get; set; } [XmlElement(Form = XmlSchemaForm.Unqualified)] [JsonProperty("b64Payload")] public string B64Payload { get; set; } }
4. 检查请求体编码与隐藏特殊字符
实际请求可能存在编码问题(如非UTF-8编码)或隐藏特殊字符(如BOM头、不可见空格):
- 将
GetRawPostData导出的内容与Swagger发送的内容做二进制对比,排查差异。 - 确保请求体为纯UTF-8编码且无BOM头。
5. 排查请求流读取冲突
若有新增中间件(如日志中间件)在[FromBody]绑定前读取过请求流,且未重置流位置,会导致反序列化失败:
- 检查新增中间件的请求体读取逻辑,确保读取后调用
contentStream.Seek(0, SeekOrigin.Begin)重置流位置。 - 可在控制器方法中先调用
GetRawPostData,再验证payLoad是否能正常绑定,确认流状态是否正常。
内容的提问来源于stack exchange,提问作者JaggenSWE
相关产品推荐
相关产品推荐

