我有一个具有以下接口的RPC服务器:
syntax = "proto3";import "google/protobuf/descriptor.proto";
import "google/protobuf/empty.proto";
option csharp_namespace = "RpcVersioningClient.Services";
service MachineService {
rpc GetCounters (google.protobuf.Empty) returns (CountersMessage);
}
message CountersMessage {
int32 module_counter = 1;
}
假设我的客户端具有较新的版本,并且无法更新服务器。客户端在CountersMessage中有一个新字段:
syntax = "proto3";import "google/protobuf/descriptor.proto";
import "google/protobuf/empty.proto";
option csharp_namespace = "RpcVersioningClient.Services";
service MachineService {
rpc GetCounters (google.protobuf.Empty) returns (CountersMessage);
}
message CountersMessage {
int32 module_counter = 1;
int32 new_module_counter = 2;
}
该字段默认为“ 0”,并且由于proto3不允许指定默认值,因此我无法使用该值来确定服务器是否支持该字段。通过分析生成的消息类,我发现有一个私有字段_unknownFields
,听起来像我需要的信息。毕竟new_module_counter
是服务器的已知字段。由于生成的消息类是局部类,因此我可以使用公共获取程序“ UnknownFields”创建第二个局部类。
public partial class CountersMessage
{
public UnknownFieldSet UnknownFields => return _unknownFields;
}
不幸的是,在收到旧服务器的内容后,该字段为空。有人知道这个领域的意图吗?
我正在尝试使服务器端反射起作用以实现相同的目标。目前,我陷入困境并寻求帮助gRPC and ASP.NET Core: serverside reflection