【发布时间】:2020-03-26 21:59:42
【问题描述】:
我们将 Golang 和 .NET Core 用于我们的相互通信微服务基础架构。 服务中的所有数据都基于我们创建的 Protobuffs 协议。 这是我们的一个 Protobuffs 的示例:
syntax = "proto3";
package Protos;
option csharp_namespace = "Protos";
option go_package="Protos";
message EventMessage {
string actionType = 1;
string payload = 2;
bool auditIsActive = 3;
}
Golang 运行良好,服务根据需要生成内容并将其发送到 SQS 队列,一旦发生这种情况,.NET 核心服务将获取数据并尝试对其进行序列化。
以下是 SQS 消息示例的内容:
{"@type":"type.googleapis.com/Protos.EventMessage","actionType":"PushPayload","payload":"<<INTERNAL>>"}
但是我们得到一个例外,说电线类型没有定义如下:
Google.Protobuf.InvalidProtocolBufferException: Protocol message contained a tag with an invalid wire type.
at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(CodedInputStream input)
at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(CodedInputStream input)
at Google.Protobuf.UnknownFieldSet.MergeFieldFrom(UnknownFieldSet unknownFields, CodedInputStream input)
at Protos.EventMessage.MergeFrom(CodedInputStream input) in /Users/maordavidzon/projects/github_connector/GithubConnector/GithubConnector/obj/Debug/netcoreapp3.0/EventMessage.cs:line 232
at Google.Protobuf.MessageExtensions.MergeFrom(IMessage message, Byte[] data, Boolean discardUnknownFields, ExtensionRegistry registry)
at Google.Protobuf.MessageParser`1.ParseFrom(Byte[] data)
两个服务中的 Proto 文件完全相同。
我们是否需要添加任何潜在的缺失选项或属性?
【问题讨论】:
-
最可能的原因是二进制有效负载处理不正确;你有一个示例二进制有效负载吗?请注意,您可以使用protogen.marcgravell.com/decode 验证有效负载 - 破坏二进制有效负载的经典方法包括:1) 通过文本编码向后运行将其“编码”(有意使用引号)将其转换为文本(您应该使用 base-64或十六进制等,如果您需要将其作为文本传递,而不是反向文本编码),2)使用 C 样式字符串(nul 终止)API(不要),或 3)截断/过度填充有效负载( protobuf 不会自动终止)
-
从问题来看,您似乎在 JSON 中传递 protobuf,所以:我的钱在上面的第一个选项上:我很高兴推测您已经将它编码为文本(对于JSON) 不正确。直到您在调用
ParseFrom之前可以恢复到原始字节,所有其他考虑都是没有意义的 -
哦! (灯亮了)你使用的是 JSON 版本的 protobuf 吗?如果是这样的话;是的,您需要使用 JSON 解析 API; protobuf 有两种格式——通常,人们指的是二进制格式,
ParseFrom(byte[])是二进制格式。如果您使用 JSON 数据格式,则需要使用 JSON 解析 API。有ParseFromJson或类似的吗?还是需要string的?编辑:检查文档,ParseJson:developers.google.com/protocol-buffers/docs/reference/csharp/…
标签: go .net-core protocol-buffers grpc protobuf-net