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属性的特征
修复方案
根据你的项目封装要求二选一即可:
- 无侵入性的最简方案:直接修改属性访问修饰符
先修改HasId抽象基类的属性抽象定义,再修改Dto类的重写实现,把ManualId的set访问器改为public:// HasId基类修改 public abstract Guid ManualId { get; set; } // Dto基类修改 public override Guid ManualId { get; set; } = Guid.NewGuid(); - 保留访问限制的方案:如果不希望业务层随意修改ManualId值,不想放开public set,可以针对JSON序列化器做配置:
- 若服务端使用Newtonsoft.Json:给
ManualId属性添加[JsonProperty]特性,或反序列化时配置允许非public属性赋值的相关参数 - 若服务端使用System.Text.Json:给
ManualId属性添加[JsonInclude]特性(.NET 5+支持),即可让反序列化器识别非public set访问器
- 若服务端使用Newtonsoft.Json:给
额外逻辑提示:当前
Dto类重写的Equals、GetHashCode方法仅校验了Id字段,没有包含ManualId,和父类HasId的相等判断逻辑不一致,后续做对象相等比较、哈希表存储操作时可能出现不符合预期的结果,建议同步修正。
内容的提问来源于stack exchange,提问作者Mitar Nikolic
相关产品推荐
相关产品推荐

