我们正在将Golang和.NET Core用于我们的互通信微服务基础架构。服务中的所有数据都基于我们创建的Probuffs协议。这是我们一个原型的例子:
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文件完全相同。
是否需要添加任何可能缺少的选项或属性?
似乎您使用的是JSON格式,而不是二进制格式。在这种情况下,[您想要ParseJson(string json)
,而不是ParseFrom(byte[] data)
(https://developers.google.com/protocol-buffers/docs/reference/csharp/class/google/protobuf/message-parser)。
注意:如果对您而言,二进制格式更有效。它还对protobuf库/工具提供了更好的支持。
基本上有两种可能的情况,或者为.NET和GoLang生成的protos文件不在同一版本中,或者在GoLang和.NET应用程序之间传输时,数据已损坏。
Protobuf是一个二进制协议,请检查是否有任何http过滤器或任何其他可以更改传入或传出字节流的东西。