.NET6 PostAsJsonAsync传含空字段对象时未命中控制器返回404
问题场景
在.NET 6项目中调用HttpClient的PostAsJsonAsync方法提交SubContract类型实体时出现异常,具体表现为:
- 当实体包含的外键关联嵌套对象除Id外所有字段均为null时,API控制器不会被触发调用,
PostAsJsonAsync无任何报错,代码直接执行后续的return await result.Content.ReadFromJsonAsync<SubContract>();逻辑,最终返回404 NotFound响应 - 若提前为外键关联对象除ID外的字段赋值,相同代码可正常运行
最初怀疑问题由Json序列化时的空值校验机制导致,因此配置了Json序列化忽略空值选项,但问题未解决,初始实现代码如下:
public async Task<SubContract> AddSubContract(SubContract subContract) { // 向已注入的httpClient调用PostAsJsonAsync方法,传入SubContract实体,参数中指定API地址 JsonSerializerOptions option = new() { DefaultIgnoreCondition = JsonIgnoreCondition.WhenWritingNull }; var result = await httpClient .PostAsJsonAsync<SubContract>("api/SubContracts", subContract, option); // 读取响应内容,反序列化为SubContract类型返回 return await result.Content.ReadFromJsonAsync<SubContract>(); }
问题调试截图:
已尝试排查方案
- 按建议注释项目中的可空引用类型配置,问题仍然存在
- 改用
PostAsync方法手动序列化实体,构造application/json类型的StringContent发起请求,测试代码如下:
// PostAsync 手动构造请求方案 var subContractSeralized = JsonSerializer.Serialize(subContract, option); var stringContent = new StringContent(subContractSeralized, encoding: System.Text.Encoding.UTF8, "application/json"); var response = await httpClient.PostAsync("api/subcontract", stringContent); return await response.Content.ReadFromJsonAsync<SubContract>();
调试确认序列化后的JSON已正确过滤嵌套对象的空字段,结果如下:
{"Id":0,"Name":"Aquatic-Repairs","Status":"In-Progress","WorkTypeId":1002,"WorkType":{"Id":0},"SiteId":3,"Site":{"Id":0},"OrganizationId":3,"Organization":{"Id":0}}
但请求仍返回404状态码,API控制器的调试断点始终未命中。
- 测试提交无嵌套外键关联对象的实体模型时,相同请求逻辑可正常命中控制器、完成数据库写入;实体属性上配置的
Required验证逻辑由仓储层统一处理,不会在路由阶段阻断请求。
目前无法定位请求未进入控制器直接返回404的根本原因,寻求解决方案。
内容的提问来源于stack exchange,提问作者Abraham
相关产品推荐
相关产品推荐

