Grpc.Core.RpcException“无法反序列化响应消息..”或“InvalidOperationException:长度不匹配”

Ang*_*ang 3 c# protobuf-net grpc

我正在 .NET Core 3.1 上运行 gRPC 服务,并尝试从 .NET Framework 4.7.2 客户端进行调用。我正在使用 protobuf-net 来重用现有的 WCF 数据契约。今天,当响应对象的字段之一不为空时,我注意到以下意外的客户端行为。

Grpc.Core.RpcException: 'Status(StatusCode="Internal", Detail="Failed to deserialize response message.")

  • 软件包:protobuf-net v2.4.4、Grpc v2.30.0、protobuf-net.Grpc v1.0.90、protobuf-net.Grpc.Native v1.0.90、Google.Protobuf v3.12.2

下面是一个示例,说明了数据契约的一般结构 - 在本例中,Response<PersonData>是响应,PersonDataList是非空字段。

   [DataContract]  
   public class Response<TValue>{
         [DataMember(Order = 1)]
         public TValue Value; 
    }

   [DataContract]  
   public class PersonData : Data {
         [DataMember(Order = 1)]
         public IList<PersonDataItem> PersonDataList; 
    }
    
    [DataContract]
    public PersonDataItem {
         [DataMember(Order = 1)] 
         public PersonDataType Type {get; private set;}
    
         [DataMember(Order = 2)] 
         public DateTime? Time {get; private set;}
    
         ....
         [DataContract]
         public enum PersonDataType : int {
    
               [EnumMember]
               Child = 1, 
               [EnumMember]
               Adult = 2
         }
    }
    
    [DataContract]
    [ProtoInclude(1, typeof(PersonData)]
    public class Data {
         [DataMember(Order = 1)]
         public string Name
    }
Run Code Online (Sandbox Code Playgroud)

让我困惑的是,我在其他数据协定中使用了类似或相同的模式,这些模式在反序列化响应时不会抛出异常。我做了一些搜索,发现2019 年的这个问题指出不同的 Google.Protobuf 版本可能是错误来源(但这里似乎并非如此)。

以前有人见过这个异常吗?我不确定这是否是我的数据合同的问题,或者可能是某些软件包版本不匹配的问题。非常感谢任何想法或建议!

我还尝试更新到 protobuf-net v3.0.0,但每次客户端调用都会出现新的客户端异常:Grpc.Core.RpcException: 'Status(StatusCode="Unknown", Detail="Exception was thrown by handler. InvalidOperationException: Length mismatch; calculated '63', actual '58'"...)这似乎是一个不同的问题,我当前的猜测是它可能与以下重大更改有关:动态类型在protobuf-net v3中。

Viv*_*Dev 5

我正在使用 Visual Studio 2022 Preview,并且面临这个问题。

正如此处提到的,Visual Studio 2022 中存在一个错误。

我应用了提到的以下解决方法,它对我有用。请参阅下面的屏幕截图。

将“热重载 CSS 更改”设置为 false,如下所示。

Visual Studio 2022 中的工具选项

热重载 CSS 更改