c# - 检测客户端/服务器版本不匹配的常用方法是什么

标签 c# client-server protocol-buffers grpc

我们正在实现一个客户端/服务器应用程序来在远程系统上运行我们的硬件。

为此,我们使用 GRPC、protobuf v3。

当我们修改 .proto 文件并重新编译客户端而不更新服务器时,我们收到一个异常,并显示一条模糊的消息:

Exception was thrown by handler.

使用 GRPC,检测客户端/服务器版本不匹配的常用方法是什么?

编辑:修改示例

例如,我们更改此(消息参数的特定类型):

service RpcAcquisitionCard {
    ...
    rpc SetNumericalControlOscillator(RpcNcoConfiguration)
    ...
}

message RpcNco {
    RpcDeviceIdentifier deviceId = 1;
    core.protobuf.RpcFrequency nco1 = 2;
    core.protobuf.RpcFrequency nco2 = 3;
}

到此(消息参数的通用类型)

service RpcAcquisitionCard {
    ...
    rpc SetNumericalControlOscillator(RpcCommandParameter)
    ...
}

message RpcCommandParameter {
    RpcDeviceIdentifier deviceId = 1;
    google.protobuf.Any parameter = 2;
}

message RpcNco {
    core.protobuf.RpcFrequency nco1 = 1;
    core.protobuf.RpcFrequency nco2 = 2;
}

其中 RpcCommandParameter.parameter 字段是 RpcNco

最佳答案

使用protobuf时,建议阅读Language Guide .

https://developers.google.com/protocol-buffers/docs/proto3#updating与您的场景特别相关:

Fields can be removed, as long as the tag number is not used again in your updated message type. You may want to rename the field instead, perhaps adding the prefix "OBSOLETE_", or make the tag reserved, so that future users of your .proto can't accidentally reuse the number.

这就是你做错的地方。而不是改变:

message RpcNco {
    RpcDeviceIdentifier deviceId = 1;
    core.protobuf.RpcFrequency nco1 = 2;
    core.protobuf.RpcFrequency nco2 = 3;
}

至:

message RpcNco {
    core.protobuf.RpcFrequency nco1 = 1;
    core.protobuf.RpcFrequency nco2 = 2;
}

您应该将其更改为:

message RpcNco {
    RpcDeviceIdentifier OBSOLETE_deviceId = 1;
    core.protobuf.RpcFrequency nco1 = 2;
    core.protobuf.RpcFrequency nco2 = 3;
}

然后您的客户端和服务器将能够相互通信,无论它们是旧的还是新的 protobuf 定义。

关于c# - 检测客户端/服务器版本不匹配的常用方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46199085/

相关文章:

c# - Xamarin.Forms 输入单元格如何更改占位符的字体大小

c# - ServiceStack Razor View 未编译

java - 如何在Java中的客户端-服务器应用程序中读写多行

xml - 避免 XML 响应中不需要的 XML 结构

android - 从 Android sqlite 数据库中检索大 blob

ajax - 如何使用 Protocol Buffer 序列化 Go 结构并在 Dart over Ajax 中使用它们

c++ - Protocol Buffer 如何支持标准容器的序列化/反序列化?

c# - 使用 LINQ 对包含列表和更新对象的对象进行排序

c# - HttpWebRequest 对象的诊断转储

java - java客户端和c服务器之间的文件传输