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

ASP.NET Core Web服务POST请求时Guid属性无法正确传递问题

问题排查结论

ManualId属性无法被服务端正确接收的核心原因是属性的set访问器被标记为protected,默认配置下的JSON反序列化器(无论是ASP.NET Core默认的System.Text.Json,还是你客户端使用的Newtonsoft.Json)都不会主动调用非public的属性set方法为属性赋值,因此你传输的ManualId值会被直接忽略,属性最终保留定义时初始化的随机Guid值,和传入值不一致。

特征验证

你可以对照以下几点确认问题匹配:

  • 同属重写属性的Id因为set访问器是public,能被正常绑定,只有ManualId绑定失败
  • 你抓包拿到的请求JSON中ManualId格式合法、值正确,客户端序列化环节没有问题
  • 服务端没有抛出格式转换类异常,只是属性值和传入值不一致,符合反序列化跳过非public set属性的特征
修复方案

根据你的项目封装要求二选一即可:

  1. 无侵入性的最简方案:直接修改属性访问修饰符
    先修改HasId抽象基类的属性抽象定义,再修改Dto类的重写实现,把ManualId的set访问器改为public:
    // HasId基类修改
    public abstract Guid ManualId { get; set; }
    
    // Dto基类修改
    public override Guid ManualId { get; set; } = Guid.NewGuid();
    
  2. 保留访问限制的方案:如果不希望业务层随意修改ManualId值,不想放开public set,可以针对JSON序列化器做配置:
    • 若服务端使用Newtonsoft.Json:给ManualId属性添加[JsonProperty]特性,或反序列化时配置允许非public属性赋值的相关参数
    • 若服务端使用System.Text.Json:给ManualId属性添加[JsonInclude]特性(.NET 5+支持),即可让反序列化器识别非public set访问器

额外逻辑提示:当前Dto类重写的Equals、GetHashCode方法仅校验了Id字段,没有包含ManualId,和父类HasId的相等判断逻辑不一致,后续做对象相等比较、哈希表存储操作时可能出现不符合预期的结果,建议同步修正。

内容的提问来源于stack exchange,提问作者Mitar Nikolic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 23:18:33