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

.NET Web API接收POST对象始终为空的问题求助

解决RestSharp提交POCO到.NET Web API时参数为空的问题

看起来你遇到的问题很典型:请求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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:53:10