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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 18:06:07