C#使用HttpClient POST提交数据时内部List属性未被服务端接收问题
问题原因及修复方案
1. 嵌套必填字段为空导致服务端过滤条目
你代码中为Geography对象赋值的createdby是空实例,没有填充userid和writetime属性,同时Geography的writetime字段为默认的0001-01-01T00:00:00非法时间,服务端在校验字段合法性时会直接丢弃不符合要求的geographies条目。
修复代码:
item.geographies.Add(new Geography() { city = location.SelectedCity, country = location.SelectedCountry, province = location.SelectedProvince, id = location.LocationGuid.ToString(), userid = _userid, source = _source ?? "Manual Entry", // 保证source有有效值 writetime = _writetime, // 补全合法时间 createdby = new CreatedByClass() { userid = _userId, writetime = _writetime } // 补全嵌套字段必填值 });
2. 时间格式不匹配服务端要求
服务端返回的时间均为带Z后缀的UTC标准ISO 8601格式,你本地序列化的时间没有时区标识,服务端无法识别会触发字段校验失败。同时你序列化后转JObject再转字符串的操作完全多余,可能会修改原有序列化配置,直接使用首次序列化结果即可。
修复代码:
// 配置序列化格式匹配服务端要求 string ItemJsonString = JsonConvert.SerializeObject(item, new JsonSerializerSettings { DateTimeZoneHandling = DateTimeZoneHandling.Utc, DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffZ", NullValueHandling = NullValueHandling.Include // 保证空字段也被正常序列化 }); // 删掉多余的JObject转换逻辑 var Content = new StringContent(ItemJsonString, Encoding.UTF8, "application/json");
3. 确认类属性匹配规则
检查Geography类的属性拼写、大小写、类型是否和服务端要求完全一致,不要加[JsonIgnore]之类的序列化忽略特性,如果使用System.Text.Json而不是Newtonsoft.Json序列化,需要确认是否配置了正确的属性命名规则。
4. 校验请求传输内容
如果上述修改后仍有问题,用抓包工具(Fiddler、Wireshark等)查看实际POST请求的Body,确认geographies字段是否正常携带,排除反向代理、WAF等中间层过滤数组字段的可能性。
内容的提问来源于stack exchange,提问作者redvolt12
相关产品推荐
相关产品推荐

