【问题标题】:Grpc client in .net standard fails when called from .net framework, but not .net core 3.1.net 标准中的 Grpc 客户端在从 .net 框架调用时失败,但不是 .net core 3.1
【发布时间】:2021-11-24 11:47:13
【问题描述】:

这是我的设置:

  • 答:.Net 标准版=2.0(gRPC 客户端库)
  • B:.Net Framework 版本=4.8(Web 应用程序 - 使用客户端库)
  • C:.Net Core 版本=3.1(WPF 应用程序 - 使用客户端库)
  • D:.Net Core 版本=3.1(gRPC 服务器,我自己创建)
  • E:.Net Core 版本=3 或 5 - 我不确定。 (gRPC 服务器,生产)

错误 =“HTTP/2 over TLS 未在仅 HTTP/2 的端点上协商。”

所以...其他人实现了这个 Grpc 服务器 (E)。我可以用这两个应用程序调用这个。没有错误。

但是为了获得一个良好的开发环境来开发这两个应用程序,我从生产服务器获取了原型文件并开发了自己的实现 (D)。我用它来测试客户端的错误处理——我可以控制服务器给出的响应。

我实现了两个完全相同的单元测试,它们实际上是集成测试。一个在 .net 框架项目中,一个在 .net 核心项目中。

它适用于 .net 核心测试,但不适用于 .net 框架。

但是,如果我注入 WinHttpHandler 而不是 HttpClientHandler,那么它可以工作。我真的不想注入处理程序(它甚至不是接口)。

如前所述,生产 gRPC 服务器也可以工作。但我不知道为什么我的失败并且生产 gRPC 服务器正常工作。

我认为我自己的 gRPC 服务实现是错误的(或缺少),但我不知道我缺少什么。

请帮忙!

【问题讨论】:

  • 请将代码发布为 文本 而不是屏幕截图。它更易于阅读和复制。

标签: c# grpc


【解决方案1】:

Grpc.Net.Client 仅适用于 .NET Framework(相对于 .NET Core 和 .NET5+),但存在限制。原因是 .NET Framework 并没有真正的 HTTP/2 实现,这是 gRPC 协议的要求(但不是 grpc-web,这是您的选择)。

Grpc.Net.Client 在某种程度上与 WinHttpHandler 一起在 .NET Framework 上工作(如您所见)。此处记录了这些限制:

【讨论】:

  • 谢谢。我的问题是通过修复另一个项目的过度复制和粘贴来解决的。事实上,我不小心告诉 Kestrel 使用 Http2。呵呵!
【解决方案2】:

实际上,我的 appsetting.json 中有这个(我从另一个项目中复制的):

"Kestrel": {
    "EndpointDefaults": {
      "Protocols": "Http2"
    }

当然,从文件中删除它解决了我的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 2021-08-03
    • 2018-05-12
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多