You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 16:52:26