问题标签 [grpc-dotnet]

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 投票
0 回答
364 浏览

c# - Grpc客户端工厂客户端不等待服务启动

我正在使用 Grpc.Net 版本:Grpc.AspNetCore 2.27.0

点网核心版本:Asp.Net Core 3.1

Grpc 服务的项目 Sdk ="Microsoft.NET.Sdk.Web"

Grpc 客户端的项目 Sdk ="Microsoft.NET.Sdk"

目标框架:netcoreapp 3.1

Grpc.Net.ClientFactory 版本:2.27.0

我使用 Grpc.Net.ClientFactory 创建了命名的 Grpc 客户端。但是,问题是,Grpc 客户端不会等待 Grpc 服务器启动。我尝试配置底层 HttpClient 的超时以及 RPC 调用截止日期。那是行不通的。如何让 Grpc 客户端等待 Grpc 服务启动,这可能是不确定的?(可能是 10 秒或 5 分钟等待) 为什么最后期限设置在这里不起作用?RPC的截止时间是多少,是服务收到请求后的等待时间,还是包括待建立通道通信在内的等待时间?它立即抛出异常。失败后如何重试异步 Grpc 调用,它的配置是什么?我感觉,Grpc.Net.Client 比 Grpc.Net 的客户端工厂好。

grpc客户端代码:

程序.cs

工人.cs

grpc服务代码:

启动.cs

我得到的异常详细信息:

0 投票
0 回答
330 浏览

c# - gRPC-web 支持.Net 中的客户端流式传输?

我一直在研究一个示例应用程序,以在客户端流模式下实现从客户端(.Net 框架或 .Net Core 2.1)到 gRPC 服务器(.Net Core 3.1)的 gRPC 通信。我读过很多次,使用 gRPC web,只有一元和服务器流是可能的。

但是,当我使用 Grpc.Net.Client.Web Nuget 包实现 gRPC Web 客户端时,我可以看到客户端流是可能的。我的 gRPC 服务器是启用了 gRPCWeb 的 Asp.NetCore 3.1 项目。

服务器端:

客户端:

如果我的理解有问题,请帮助我。

0 投票
1 回答
137 浏览

c# - 将服务器流式读取到客户端 c#

我正在使用服务器流式处理应用程序。

问题是客户端没有从服务器流中读取数据。

这是我的proto服务:

c#服务器是这样的:

它之所以有效,是因为我有一个 NodeJS 客户端,我可以在其中调用服务器并完美运行。

Node中的客户端是

而c#客户端是:

我还添加了 atry/catch并且它不输出任何东西,所以它似乎MoveNext()总是false.

这里有什么问题?为什么 NodeJS 客户端可以工作而 c# 客户端无法读取流?我错过了什么吗?

这是完整的 client.cs 类:

0 投票
1 回答
257 浏览

c# - 自托管 GRPC 服务器

我正在尝试从 WCF 过渡到将我们的代码库迁移到 .NET Core。我们的服务目前都作为 Windows 服务托管,因此我也在尝试自托管 gRPC 服务(而不是构建AspNetCore应用程序)。我已经使用 成功构建了一个服务器Grpc.Core.Server,客户端也使用Grpc.Net.Client.GrpcChannel,请参阅下面的代码片段以供参考。

服务器:

客户:

但是,由于我们的应用程序仍在运行,.Net Framework 4.8因此在测试此代码时出现运行时异常:

System.PlatformNotSupportedException:gRPC 需要对不支持 gRPC over HTTP/2 的 .NET 实现进行额外配置。必须使用 GrpcChannelOptions.HttpHandler 指定 HTTP 提供程序。配置的 HTTP 提供程序必须支持 HTTP/2 或配置为使用 gRPC-Web。有关详细信息,请参阅https://aka.ms/aspnet/grpc/netstandard

这导致我在客户端添加以根据错误中的链接Grpc.Net.Client.Web.GrpcWebHandler切换到。Grpc-web

但是,我现在正在努力为服务器做同样的事情来支持Grpc-web. 此处的指南建议 (1) 使用Grpc.AspNetCore.Web或 (2) 使用“Envoy 代理”来获取支持它的服务器。(1) 的问题是我没有使用AspNetCore,所以我认为这个解决方案不合适,而且我在简单的 C# 解决方案中找不到任何轻量级/简单的方法来执行 (2)。

如果没有添加服务器端支持,我会得到这个异常:

Grpc.Core.RpcException : Status(StatusCode="Internal", Detail="Error starting gRPC call. HttpRequestException: 发送请求时出错。WebException: 服务器违反了协议。Section=ResponseStatusLine", DebugException="System .Net.Http.HttpRequestException:发送请求时出错。

我认为这显然与服务器不支持Grpc-web请求的事实有关。所以我现在在这方面有点死胡同。我觉得我需要弄清楚如何自托管AspNetCore服务器并转移到它而不是Grpc.Core.Server,这将打开选项(1),但我发现几乎没有证据表明实际上是可能的。

所以我想我的主要问题是:有什么方法可以支持Grpc-web通过托管的服务器中的客户端Grpc.Core.Server

如果答案是否定的--> 我如何自托管支持Grpc-web客户端的 GRPC 服务器?

0 投票
0 回答
27 浏览

c# - C#从取消的grpc调用接收结果

我有两个服务通过 gRPC(A 调用 B)进行通信,取消令牌为 X 秒。
B 服务处理请求的时间可能比允许的时间长。在这种情况下,我想返回一个部分结果(如果有的话)并在服务 A 中接收它。

问题:如果可能,我怎样才能在服务 A 中获取返回的结果?如果没有,没有什么替代方案?

文档来看,双方都独立跟踪截止日期,因此它无法工作。我假设 CancellationToken 也是如此。

AC#/伪代码示例。服务 A 调用 B 的时间限制为 3 秒,B 将需要 10 秒才能完成,并且将始终被取消。我想收到值 100,如果在服务 A 的示例案例中取消,则返回。

服务一:

服务乙:

0 投票
0 回答
103 浏览

.net-core - 读取 grpc 的点网核心中间件中的请求正文

我有一个单一的服务,它使用 dot net core 3.1 托管 API 控制器和 GRPC。我有需要同时适用于(API 和 GRPC)的中间件,并且我需要阅读其中的请求正文。我尝试了以下方法,它适用于 API 请求,但不适用于 grpc。当我读取流时,我会在其中获得用于 grpc 请求有效负载的 unicode 字符,例如“\0\0\0\0�\n�\u0001”。

0 投票
1 回答
127 浏览

protobuf-net - 如何序列化数组中的空值?

我正在使用 Windows 平台上的 protobuf-net v3.0.101 并在使用 grpc protobuf-net 对其进行序列化时获取以下字符串数组中的空值异常:

我已经这样定义了我的 DataContract:

这是我尝试序列化的实际消息:

而且,这就是我调用 Serializer 的方式:

这是一个例外:

0 投票
0 回答
53 浏览

nginx-ingress - Keepalive not working as expected in gRPC dotnet core client and gRPC nginx-ingress controller

We have a gRPC dotnet core service running on Kubernetes behind Nginx. The service has bidirectional streaming endpoint. The ingress is configured with grpc_read_timeout, grpc_send_timeout & client_body_timeout as per documentation to allow the connections to be kept open. Here is the partial ingress definition:

There is a gRPC dotnet client app that consumes this gRPC service and uses SocketsHttpHandler so that it can send KeepAlive pings during inactivity period.

From the Nginx debug logs we can see that keepalive pings are being sent from client but the server resets stream when grpc_read_timeout / grpc_send_timeout is reached during period of inactivity. We tried the client without enabling keepalive pings and the behaviour is still the same, connection remains open until read/send timeout is reached. Therefore keepalive pings seem to be adding no value.

My understanding / assumption was that if we keep sending keepalive pings, the server should not reset stream. Not sure if we have some configuration / implementation issue or if we are misinterpreting & this is by design?

Any pointers / help is much appreciated. Thanks.

0 投票
1 回答
43 浏览

c# - 如何从 proto 文件生成 POCO 和接口

在很多人看来,我的要求可能有点“奇怪”:

所以给定一个像下面这样的原始文件:

我想生成 POCO 和相应的接口(而不是具体的 gRPC 服务),如下所示:

也就是说,我只使用 proto 文件作为不同语言(比如 JavaScript 和 C#)之间的某种“契约”,但跳过 gRPC 的“通信”部分,因为我们不需要 http/2 什么的。

我用谷歌搜索了很多,但似乎不存在这样的项目。现在我正在考虑通过扩展grpc-dotnet项目(可能使用 T4 模板)来制作自己的项目,但在开始之前我只需要一些/任何建议/帮助/信息。所以这是我的问题:

  1. 是否有任何项目/图书馆在做与我上面所说的类似但我还不知道的事情?

  2. grpc-dotnet 是否具有任何类型的可扩展性,允许我生成所需的 C# 类型而无需编译 proto buffs(如果有的话,我可以获得编译的数据结构吗)

  3. 在开发成本、难度等方面是否可行?

  4. 还有其他建议走正确的道路吗?

非常感谢您,任何评论/答案将不胜感激!

0 投票
1 回答
58 浏览

c# - 从 grpc.core 迁移到 grpc-dotnet

我们想将我们的项目从 grpc.core 迁移到 gprc-dotnet。在我的 grpc 服务器中,我引用了包 Grpc.AspNetCore。proto 文件在不同的项目中编译并共享。当我实现我的服务器方法时:

ServerCallContext 类要求我导入要删除的 Grpc.Core。我应该如何使用 grpc-dotnet 来实现我的覆盖,例如 ServerCallContext 类?

看起来 ServerCallContext 是在包含命名空间 Grpc.Core 的包 Grpc.Core.Api 中实现的。这有点令人困惑,但可能是为了向后兼容而实现的。也许有人可以对此发表评论。因此,在这种情况下唯一真正要做的就是使用正确的 nuget 包 Grpc.AspNetCore.Server。对 Grpc.Core 的引用将从这个和底层引用的程序集中提取。