.NET Web API接收POST对象始终为空的问题求助
看起来你遇到的问题很典型:请求JSON格式完全有效,模型状态也显示绑定成功,但实际接收的POCO对象属性全是默认值。结合你提供的代码、日志和抓包信息,我整理了几个针对性的排查和解决步骤:
1. 移除[Serializable]特性试试
你的SimplePOCO类标注了[Serializable],但这个特性主要用于.NET二进制序列化,Newtonsoft.Json(Web API默认的JSON解析器)并不依赖它,反而可能因为这个特性改变序列化行为。
默认情况下,Newtonsoft.Json会优先处理公共属性,但如果类带有[Serializable],它会转而尝试序列化字段(你的类没有定义公共字段),最终导致属性无法被正确填充。
修改后的类定义:
public class SimplePOCO { public SimplePOCO() {} public int MyProperty { get; set; } public string MyProperty2 { get; set; } }
2. 替换RestSharp的AddJsonBody为手动序列化
RestSharp的AddJsonBody可能使用内置序列化器,和Web API的Newtonsoft.Json存在兼容性差异。你可以手动用Newtonsoft.Json序列化对象,再添加到请求体,确保序列化规则完全一致:
public void PostSimplePOCO(SimplePOCO simplePOCO) { var request = new RestRequest("api/Warehouse/SimplePOCO", Method.POST); // 手动序列化,确保和服务端解析规则匹配 var jsonPayload = Newtonsoft.Json.JsonConvert.SerializeObject(simplePOCO); request.AddParameter("application/json", jsonPayload, ParameterType.RequestBody); IRestResponse response = Execute(request); }
3. 检查Web API的JSON序列化配置
确认你的Web API没有自定义的JsonSerializerSettings干扰属性绑定。打开WebApiConfig.cs,检查是否有类似以下的配置:
config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new CamelCasePropertyNamesContractResolver();
如果有,暂时注释掉测试(或者确保客户端序列化的属性名和服务端解析规则匹配)。另外,避免设置MissingMemberHandling = MissingMemberHandling.Error,这会导致JSON中存在类未定义的属性时抛出错误,但你的情况是属性完全匹配,这个可能性较低。
4. 手动在控制器反序列化请求体(临时排查方案)
既然你已经能拿到有效的请求体字符串,可以在控制器里手动反序列化,验证是否能得到正确的对象:
[HttpPost] [Route("api/Warehouse/SimplePOCO")] public void ImportPOCO([FromBody]SimplePOCO simplePOCO) { using (var stream = new MemoryStream()) { var context = (HttpContextBase)Request.Properties["MS_HttpContext"]; context.Request.InputStream.Seek(0, SeekOrigin.Begin); context.Request.InputStream.CopyTo(stream); string requestBody = Encoding.UTF8.GetString(stream.ToArray()); // 手动反序列化测试 var manuallyDeserialized = Newtonsoft.Json.JsonConvert.DeserializeObject<SimplePOCO>(requestBody); // 这里可以检查manuallyDeserialized的属性是否正确填充 } }
如果手动反序列化得到了正确的对象,说明问题出在Web API的模型绑定环节,大概率是序列化配置或类特性的问题;如果手动反序列化也失败,就要仔细核对客户端和服务端的SimplePOCO类定义是否完全一致(包括命名空间、属性类型、大小写等)。
5. 确认客户端和服务端的SimplePOCO类完全一致
虽然你提供了类定义,但要确保客户端项目中的SimplePOCO和服务端项目中的类:
- 属性名称、类型完全匹配
- 访问修饰符都是
public - 没有额外的属性或细微差异
有时候复制类定义时可能会出现大小写错误、类型不匹配等问题,导致无法正确绑定。
内容的提问来源于stack exchange,提问作者Lewis Hamill

