问题标签 [protobuf-net.grpc]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
181 浏览

protobuf-net - 是否可以将默认序列化程序设置为 protobuf-net 中的预编译序列化程序?

我正在将 protobuf-net 与 protobuf-net.grpc 一起使用,并试图让它在 Xmarin/Ios 上工作。

目前我试图创建一个预编译的序列化程序:

当我引用这个 .dll 并new PDASerializers().Serialize(new UserInfo())没有问题时它可以正常工作。

然而,当我试图全力以赴并使用protobuf-net.grpc.

问题是,只要我打电话:channel.CreateGrpcService<ISomeInterface>我得到一个反射。发射错误:

注意。

我在不同的地方读到关闭“自动编译”可能是一种解决方法。这确实解决了我 nog 开始能够直接调用 Serialize - 所以看起来我不需要预编译的序列化程序。

在深入了解 protobuf 的内部工作原理后,我尝试这样做:

但遗憾的是这也没有解决问题。


具体来说,我的问题如下;

是否可以替换默认序列化程序以使用 protobuf-net.grpc 中的预编译序列化程序,或者是否有其他方法可以全局关闭“自动编译” (对于 protobuf-net.grpc 也是如此)?

0 投票
2 回答
841 浏览

asp.net-core - 使用 gRPC-Web 和 protobuf-net 在工作服务中添加新方法时出现异常

我收到以下异常:

Microsoft.AspNetCore.Components.WebAssembly.Rendering.WebAssemblyRenderer[100] 未处理的异常呈现组件:“DefaultProxyCache 1' threw an exception. System.TypeInitializationException: The type initializer for 'DefaultProxyCache1”的类型初始化程序引发异常。---> System.ArgumentException:无效的通用参数参数名称:typeArguments at (wrapper managed-to-native) System.Reflection.RuntimeMethodInfo.MakeGenericMethod_impl(System.Reflection.RuntimeMethodInfo,System.Type[]) at System.Reflection.RuntimeMethodInfo .MakeGenericMethod(System.Type[] methodInstantiation) <0x342def8 + 0x000d6> in :0 at ProtoBuf.Grpc.Internal.ContractOperation.TryGetClientHelper() [0x0001b] in //src/protobuf-net.Grpc/Internal/ContractOperation.cs: 291 在 ProtoBuf.Grpc.Internal.ProxyEmitter.EmitFactory[TService] (ProtoBuf.Grpc.Configuration.BinderConfiguration binderConfig) [0x00477] 在 //src/protobuf-net.Grpc/Internal/ProxyEmitter.cs:238 在 ProtoBuf.Grpc.Internal.ProxyEmitter.CreateFactory[TService] (ProtoBuf.Grpc.Configuration.BinderConfiguration binderConfig) [0x0006d] in //src/protobuf-net .Grpc/Internal/ProxyEmitter.cs:123 at ProtoBuf.Grpc.Configuration.ClientFactory+DefaultProxyCache`1[TService]..cctor()[0x00000] in //src/protobuf-net.Grpc/Configuration/ClientFactory.cs: 81

我的项目使用 gRPC-Web、Blazor Web 程序集和 protobuf-net

这是我的服务合同:

实现是:

至于数据合同:

和,

在我返回服务中的客户列表之前,但我意识到我需要一个类来对消息进行建模,以便 protobuf-net 能够序列化,这就是 CustomerResultSet 的原因。尽管如此,它仍然无法正常工作。非常感谢任何帮助

0 投票
1 回答
331 浏览

c# - 将 protobuf-net RuntimeTypeModel 与 GrpcClient (AddCodeFirstGrpcClient) 一起使用

我尝试将自定义 protobuf-net RuntimeTypeModel 与 protobuf-net grpc 客户端库一起使用。到目前为止我所了解的,我需要使用 ClientFactory 并设置一个引用我的 RuntimeTypeModel-Instance 的 binder-configuration。

如果我每次自己创建客户端和底层 grpc 通道,这是可行的。

现在,我想通过 nuget 包protobuf-net.Grpc.ClientFactory 提供的 DI 使用 GrpcClientFactory

我不知道,如何配置 ClientFactory 以使用我的自定义 RuntimeTypeModel。在我的启动中,我尝试了以下方法:

我可以在我的控制器类中使用 IMyGrpcService 并获得一个有效的实例。但是永远不会调用 o.Creator 委托,并且使用了错误的 runtimeTypeModel。

这种方法有什么问题?

谢谢。托尼

0 投票
1 回答
10 浏览

protobuf-net.grpc - 如何在反序列化期间检测环境

有没有办法找出,如果在客户端反序列化期间或在服务器反序列化期间调用构造函数?我谈论了共享项目中标有 DataContract 属性的类的构造函数。

谢谢你汤姆

0 投票
1 回答
400 浏览

asp.net-core - 尝试使用 protobuf-net 通过 gRPC-Web 进行 Azure AD 身份验证

我正在尝试在 blazor webassembly 应用程序中使用 gRPC-Web 进行 Azure AD 身份验证。我正在使用 protobuf-net 来帮助我进行序列化。我不确定如何传递令牌以让服务器端识别它。这就是我所拥有的:

并且,我将其作为参数发送到我想要使用的方法中

这是注入服务的方式:

这是服务的发布方式:

而且,这是实现:

我得到的错误是无法从“Grpc.Core.Metadata”转换为“Grpc.Core.ServerCallContext”,这很明显。

我发现的参考使用了元数据,但我应该使用的是 ServerCallContext https://docs.microsoft.com/en-us/dotnet/architecture/grpc-for-wcf-developers/metadata 所以我错过了什么,我做错了什么,如何使用 protobuf-net 正确使用两者?

0 投票
1 回答
313 浏览

c# - 在 protobuf-net 中序列化 IEnumerable

我有一个相当重量级的 DTO 库,目前一些 WCF 服务正在使用它。我们正试图将它带入 protobuf-net 世界,尽可能少地进行修改。一组特定的项目给我序列化带来了麻烦。我将在这里简单地介绍它们,因为它有点复杂,但问题的要点是:

我忽略了装饰器,因为我不认为它们是问题,主要是因为如果我添加void Add(Key item) { }KeyCollection整个东西似乎工作。否则,我在尝试序列化ContainerType1.

实际上,更改的签名KeyCollection有点令人望而却步,所以我试图按照这个答案尝试以编程方式进行。具体来说,在和的“键”上设置itemTypedefaultType为空。我也设置为...这完全行不通。我在客户端上收到一个通用的“无法反序列化”异常,如果有帮助,我可以在这里发布。在服务器端,我使用 将其序列化,并吐出对象的 JSON 以及它们似乎都可以正常工作。ValueMemberContainerType1ContainerType1BaseContainerBase<Item>IgnoreListHandlingtrueKeyCollectionSerializer.Serialize()Serializer.GetProto<>()

如何关闭列表处理?与此相关,有没有办法在序列化时打开额外的调试以尝试获取有关问题的更多信息?

0 投票
2 回答
92 浏览

c# - 序列化基类属性

所以,如果我有:

我尝试序列化Request并反序列化BaseRequest,它不起作用。它不知道具体的类是什么。我需要添加一个[ProtoInclude]. 这对我来说很有意义。

我看到的是,如果我序列化请求并反序列化请求,那也不起作用,我认为这是出乎意料的。我希望序列化程序已经知道在这种情况下工作所需的一切。[ProtoInclude]即使我要序列化的只是请求,我也需要包含on BaseRequest。

我遇到麻烦的地方是我在库中定义了一个 BaseRequest 并且该库的使用者需要从它继承。基本上,一种特定类型的请求必须附加数据——除了转储继承并将该代码复制/粘贴到每个子类中之外,是否有这种模式?

0 投票
1 回答
213 浏览

c# - 首次使用 protobuf-net c# 访问 gRPC 端点时性能缓慢

我有一个使用 .NET Core 3.1 的 protobuf-net.gRPC 运行的 gRPC 服务器。它在后台使用 ASP.NET Core 框架和 Kestrel 来运行 HTTP 服务器。我注意到与在同一端点上的后续调用相比,第一次在此服务器上命中的 gRPC 端点在 ASP NET Core 中间件中花费的时间要多得多。

第一次花费的时间相当长,大约 30-40 Ma,而随后对同一端点的调用大约是 1-2 ms。

这是因为 JIT 编译器是从 IL->Native 代码编译的吗?如果是这样,除了强制调用端点等显而易见的方法之外,还有其他方法可以解决这个首次性能问题吗?

问候

0 投票
3 回答
74 浏览

mongodb - 使用成员编号保存文档,而不是使用 protobuf-net 和 MongoDB 的名称

我在某处看到使用 Go MongoDB 驱动程序可以使用订单号而不是字段名称保存文档。
他们最终在数据库中得到了这个:

我喜欢这个主意!因此,我试图找到一种对 MongoDB C# 驱动程序执行相同操作的方法。
我有下面的代码,但我不确定我应该从 protobut-net 带来什么来获取会员订单号。

SetElementName接受一个字符串参数。
如何从 protobuf-net 中获取成员的订单号?
...Member.Order.ToString()
我不知道这整件事是否是个好主意,但我想测试一下。

谢谢

- 更新 -

只是为了添加更多信息。我正在为我的模型使用继承来使用泛型。

我添加了这一行,如 protobuf-net 文档中所示:

因此,有了这个以及 Marc 显示的获取成员编号的内容,我最终在 MongoDB 中拥有了一个自定义约定类,<T>因此我可以将它用于其他对象:

该公约的注册是这样完成的:

运行后我得到这个错误:

Grpc.AspNetCore.Server.ServerCallHandler[6] 执行服务方法“CreateOne”时出错。MongoDB.Bson.BsonSerializationException:类型为“Nnet.Models.Base”的属性“UpdatedDate”不能使用元素名称“30”,因为它已被属性“CreatedDate”使用...

另外,当我运行下面的代码时,我希望得到 Todo 对象的所有成员。

但是,我没有得到从 Base 对象继承的那些:

❯ dotnet run
10:标题
20:内容
30:类别

0 投票
2 回答
214 浏览

protobuf-net - 使用 protobuf-net.Grpc 生成通用服务的 .proto 文件

我正在尝试生成此结构的 .proto :

-- 模型 --
基本模型

待办模型

加上这一行:

-- 合同 --
基础合同

待办合同

使用这种通用方法,我试图防止重复代码。

-- 启动.cs --

所以,当我运行这个:

我在 .proto 文件中得到这个输出:

在 .proto 文件部分service Todoservice,我缺少 Base 合约中的其他两个函数。还有,函数的返回类型rpc GetOneByQuery (Query) returns (Base);不对,应该是Todo。

有什么建议么?