Protobuf gRPC枚举字符串值获取及Postman与C#兼容问题
gRPC枚举反序列化默认值问题解决
问题背景
使用Grpc.AspNetCore 2.53.0 + .NET Core 7.0.5,proto中定义的BookStatus枚举在Postman中提示用字符串值(如"bookStatus": "IDEA"),但C#接收后始终是默认值0,传数字也无效。
解决方案
1. 配置gRPC JSON转码的枚举处理
在Program.cs中注册gRPC服务时,添加JSON转码配置,指定枚举用字符串序列化/反序列化,和Postman的提示格式对齐:
builder.Services.AddGrpc() .AddJsonTranscoding(options => { // 保持proto字段名不变,不转驼峰 options.JsonOptions.PropertyNamingPolicy = null; // 添加字符串枚举转换器,支持字符串和数字两种格式解析 options.JsonOptions.Converters.Add(new JsonStringEnumConverter()); });
2. 确认项目proto编译配置
检查.csproj文件中Protobuf的编译设置,确保正确生成服务端代码:
<ItemGroup> <Protobuf Include="Protos\你的proto文件名.proto" GrpcServices="Server" /> </ItemGroup>
3. 测试两种传值格式
配置完成后,Postman中两种传值方式都能正确解析:
- 字符串形式:
"bookStatus": "PUBLISHED" - 数字形式:
"bookStatus": 7
4. 排查自定义分部类问题
如果你的业务类继承了生成的基分部类,检查是否在自定义代码中错误覆盖了BookStatus属性的赋值逻辑,确保直接使用基类生成的属性,不要手动设置默认值。
内容的提问来源于stack exchange,提问作者ricardosmg
相关产品推荐
相关产品推荐

