从 .net 框架调用时,.net 标准中的 Grpc 客户端失败,但不是 .net core 3.1
Grpc client in .net standard fails when called from .net framework, but not .net core 3.1
这是我的设置:
- A: .Net Standard 版本=2.0(gRPC 客户端库)
- B: .Net Framework 版本=4.8(网络应用程序 - 使用客户端库)
- C: .Net Core 版本=3.1(WPF 应用程序 - 使用客户端库)
- D: .Net Core version=3.1 (gRPC Server, 本人自创)
- E: .Net Core Version=3 或 5 - 我不确定。 (gRPC 服务器,生产)
错误 =“HTTP/2 未在仅 HTTP/2 端点上协商通过 TLS。”
所以...其他人实现了这个 Grpc 服务器 (E)。我可以用这两个应用程序调用这个。没有错误。
但是为了获得用于开发这两个应用程序的良好开发环境,我从生产服务器获取了原型文件并开发了我自己的实现 (D)。我用它来测试客户端中的错误处理 - 我可以控制服务器给出的响应。
我实现了两个完全相同的单元测试,它们实际上是集成测试。一个在 .net 框架项目中,一个在 .net 核心项目中。
它适用于 .net 核心测试,但不适用于 .net 框架。
但是,如果我注入 WinHttpHandler
而不是 HttpClientHandler
,那么它就可以工作。我真的不想注入处理程序(它甚至不是接口)。
如前所述,生产 gRPC 服务器也可以正常工作。但是我不知道为什么我的失败而生产 gRPC 服务器工作。
我认为我自己对 gRPC 服务的实现是错误的(或缺少),但我不知道我错过了什么。
请帮忙!
Grpc.Net.Client 仅适用于 .NET Framework(相对于 .NET Core 和 .NET5+),但有限制。原因是 .NET Framework 并没有真正的 HTTP/2 实现,这是 gRPC 协议的要求(但不是 grpc-web,这是你的一个选项)。
Grpc.Net.Client 在某种程度上与 WinHttpHandler 一起在 .NET Framework 上工作(如您所见)。限制记录在此处:
实际上,我的 appsetting.json 中有这个(我从另一个项目复制的):
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
当然,从文件中删除它解决了我的问题。
这是我的设置:
- A: .Net Standard 版本=2.0(gRPC 客户端库)
- B: .Net Framework 版本=4.8(网络应用程序 - 使用客户端库)
- C: .Net Core 版本=3.1(WPF 应用程序 - 使用客户端库)
- D: .Net Core version=3.1 (gRPC Server, 本人自创)
- E: .Net Core Version=3 或 5 - 我不确定。 (gRPC 服务器,生产)
错误 =“HTTP/2 未在仅 HTTP/2 端点上协商通过 TLS。”
所以...其他人实现了这个 Grpc 服务器 (E)。我可以用这两个应用程序调用这个。没有错误。
但是为了获得用于开发这两个应用程序的良好开发环境,我从生产服务器获取了原型文件并开发了我自己的实现 (D)。我用它来测试客户端中的错误处理 - 我可以控制服务器给出的响应。
我实现了两个完全相同的单元测试,它们实际上是集成测试。一个在 .net 框架项目中,一个在 .net 核心项目中。
它适用于 .net 核心测试,但不适用于 .net 框架。
但是,如果我注入 WinHttpHandler
而不是 HttpClientHandler
,那么它就可以工作。我真的不想注入处理程序(它甚至不是接口)。
如前所述,生产 gRPC 服务器也可以正常工作。但是我不知道为什么我的失败而生产 gRPC 服务器工作。
我认为我自己对 gRPC 服务的实现是错误的(或缺少),但我不知道我错过了什么。
请帮忙!
Grpc.Net.Client 仅适用于 .NET Framework(相对于 .NET Core 和 .NET5+),但有限制。原因是 .NET Framework 并没有真正的 HTTP/2 实现,这是 gRPC 协议的要求(但不是 grpc-web,这是你的一个选项)。
Grpc.Net.Client 在某种程度上与 WinHttpHandler 一起在 .NET Framework 上工作(如您所见)。限制记录在此处:
实际上,我的 appsetting.json 中有这个(我从另一个项目复制的):
"Kestrel": {
"EndpointDefaults": {
"Protocols": "Http2"
}
当然,从文件中删除它解决了我的问题。