问题标签 [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.
grpc - grpc-dotnet 客户端:内存使用过多
我有一个 gRPC 客户端集成,它接收大小约为 65MB 的消息(主要是日期 x 时间元组数组)。反序列化收到的消息似乎在初始请求上分配了大约 700MB 的额外非托管内存。随后的相同请求不再增加总进程内存消耗。
这正常吗?任何想法如何弄清楚发生了什么,甚至更好地控制它?
c# - ASP.NET Core 3.1 在HttpPut请求中读取流文件上传问题
问题陈述:
我正在尝试使用 Request.Body 流在 HttpPut 请求中迭代流式文件上传,但我遇到了真正的困难,而且我的 google-fu 几乎没有出现。情况是我希望这样的事情能够奏效,但它不会:
在调试器中,我可以检查 Request.Body 并查看它的 internal _buffer
。它包含所需的数据。上面的代码运行时,MemoryStream
全是零。在“读取”期间,缓冲区也充满了零。Request.Body 的长度也为 0。
目标:
使用 HttpPut 请求通过流式传输上传文件,以块的形式对其进行迭代,进行一些处理,然后使用 gRPC 将这些块流式传输到另一个端点。我想避免将整个文件读入内存。
我试过的:
这有效:
该代码会将所有 Stream 作为字符串读入内存,这是非常不可取的,但它向我证明,可以在我正在处理的方法中以某种方式读取 Request.Body 数据。
在 Startup.cs 类的 configure 方法中,我包含以下内容以确保启用缓冲:
我曾尝试将 Request.Body 封装在另一个流中,例如BufferedStream
andFileBufferingReadStream
并且那些没有任何区别。
我试过了:
这也出现了MemoryStream
全零的 a。
c# - 如何在 .Net Core 中使用 Grpc 检索流式传输结果?
我正在使用 gRPC 构建一个 .NetCore 应用程序。
我在构建代码来处理流结果时遇到问题。
考虑以下 protobuf 定义:
这是从流中读取结果的代码片段:
我一直在谷歌搜索,发现类似于我上面处理流结果的代码的东西。但是代码无法编译。 ReadAllAsync()在IAsyncStreamReader的接口定义中不可用。
.Net Core 中是否不提供/支持此功能?我正在使用 Grpc (2.38) 的最新稳定版本。
如果这对我不可用,如何从.Net Core 中的ResponseStream检索结果?
谢谢,约翰B
grpc - 设置 grpc-web 调用的标头
我目前面临 grpc-web 和负载均衡器的问题。尝试从我们的网关 API 调用我们的 grpc 网络服务,会导致以下错误:
似乎需要以下任一标头,内容长度或传输编码。
我有一种在客户端中设置元数据的方法。
这是我创建客户的方式:
这就是我如何使用这两个
现在。问题是我无法设置 Transfer-Encoding 或 Content-Lenght 标头。他们只是在某处被剥夺。如果提琴手正在运行,它们会被添加(我假设是提琴手),并且请求实际上有效。但如果提琴手没有运行,标题不存在,我得到上述错误。(老实说,我不了解提琴手的部分,我只是报告我所看到的)。
有谁知道为什么会这样?如果甚至可以添加我尝试使用 grpc-web 添加的标头?
dependency-injection - gRPC 通道在 .NET 依赖注入中应该是单例的、作用域的还是瞬态的?
.NET 中的 gRPC 请求依赖于必须关闭和处理的通道:
我使用 .NET 依赖注入服务将它包装起来IServiceCollection
,这应该是......
- 每个方法 - 在每个方法调用中创建和处置通道。
AddTransient
- 每次请求我的服务时都会创建一个新频道,但仅在需要时提供。AddScoped
- 每个请求都有一个新通道,但在请求完成之前保持通道打开。AddSingleton
- 应用程序的一个新频道。
我认为 AddSingleton
已经出局了,因为我不确定如何同时GrpcChannel
处理大量并行请求,并且我想传递CancellationToken
当前请求。
这在AddScoped
vsAddTransient
与 per-method 之间进行了选择。如果没有大量的测试(并且绊倒了所有的陷阱),我不确定这里的最佳实践是什么(我是 gRPC 的新手)。我应该尽快关闭频道,还是保持打开并在通话之间共享?
c# - Grpc 客户端抛出 Grpc.Core.RpcException(响应协议降级到 HTTP/1.1。)
我花了最后三天(阅读文档,尝试不同版本的 VS 和 .NET,检查 Stackoverflow 中的问题,github 中的问题,...)关于我的 Grpc 客户端,服务器启动正常但客户端无法正常工作,我尝试了 Grpcurl它工作正常,但C# 客户端从不工作并抛出 Grpc.Core.RpcException 这里是一个 smaple:
这个问题发生在VS2019, VS2022 (Net5, Net6)中。有什么我可以做的吗?因为我们将在下一个项目中使用 Grpc。
c# - Grpc.Net 中作为 Singleton 的 Grpc 服务类
默认情况下,Asp.Net Core 将 Grpc 服务类作为范围来处理并发 Web 请求的多线程。但是,我们仍然可以在 ConfigureServices() 中将 Grpc 服务类设置为 Singleton
services.AddSingleton<GreeterService>
我这样做是因为,我想从 Grpc 服务本身启动我的 Grpc 客户端调用,我只想一次执行。在这里,Grpc 服务和客户端都作为单个项目中的单个进程执行。
GrpcServices="both"
但是,同一项目的多个副本(嵌入的 Grpc 服务和客户端)可以共存以复制主节点和备用节点场景,其中每个节点都有自己的单个 Grpc 服务和 Grpc 客户端。它是否会导致多线程用例的任何问题/性能问题,因为每个 Grpc 服务节点可以从其他节点并行获取多个 Grpc 客户端调用,并且每个 Http2 请求都有一个线程执行?
c# - 如何摆脱 ASP.NET Core gRPC 集成测试项目中的编译器警告
我有一个想在其上运行集成测试的 ASP.Net Core gRPC 项目。因此,我建立了一个集成测试项目。
我的目录结构如下所示:
为了设置WebApplicationFactory
调用Startup
类MyService.Grpc
并使用提供的生成客户端Grpc.Net.Client
,我将测试项目设置如下:
请注意,我从测试项目中引用了 gRPC 服务器项目 ( MyService.Grpc.csproj
) 和原型文件 ( )。my-service.proto
一切都可以编译,但我遇到了一些我想摆脱的编译警告。
我理解编译器在抱怨什么,因为该类型MyRequest
被定义了两次:一次由Grpc.Net.Client
proto 文件生成,一次由项目引用导入生成。同时,我无法摆脱测试项目中的任何一个引用,因为我需要它们。
我的问题是如何在我的测试中不两次导入相同类型的情况下摆脱这个警告?