当前位置: 首页 > 知识库问答 >
问题:

.net 标准中的 Grpc 客户端在从 .net 框架调用时失败,但从 .net 核心 3.1 调用时不会失败

梁马鲁
2023-03-14

这是我的设置:

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

错误="HTTP/2 over TLS未在仅HTTP/2endpoint上协商。"

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

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

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

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

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

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

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

请帮忙!

共有2个答案

萧鸿轩
2023-03-14

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

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

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

申屠健
2023-03-14

Grpc.Net.Client只适用于. NET Framework(与. NET Core和. NET5相反),但有限制。原因是. NET Framework没有真正的HTTP/2实现,这是gRPC协议的要求(但不是grpc-web,它是您的一个选项)。

Grpc.Net。客户机在某种程度上使用WinHttpHandler在.NET框架上工作(正如您所发现的)。此处记录了这些限制:

  • https://docs.microsoft.com/en-us/aspnet/core/grpc/supported-platforms?view=aspnetcore-6.0净grpc客户要求
  • https://docs.microsoft.com/en-us/aspnet/core/grpc/netstandard?view=aspnetcore-6.0#net框架
 类似资料:
  • 下面的代码正在工作。NET框架(4.5-4.8)。但是它在所有的版本中都失败了。NET Core,其中包含一条消息"收到的消息是意外的或格式错误的"。我已经尝试了所有SSL协议。 我正在使用控制台应用程序和核心应用程序没有任何额外的包。我也在使用相同的操作系统,相同的VS 2019在相同的系统。NET框架和.NET核心。它也与POSTMAN\SOAPUI一起工作。

  • 我有一个用。NET核心实现的gRPC服务器,我希望与运行在。NET Framework中的控制台应用程序联系。 我在发送请求时得到以下异常: rpc.core.rpcexception:'statuscode=“不可用”,detail=“DNS解析失败服务:https://localhost:5001”,debugexception=“grpc.core.internal.coreerrordet

  • 我读过关于.NET标准和.NET核心之间的区别,但我真的不知道区别是什么,也不知道什么时候选择.NET标准库项目,什么时候选择.NET核心库项目。

  • 遵循以下文档:https://docs.microsoft.com/fr-fr/aspnet/core/grpc/authn-and-authz?view=aspnetcore-3.0#承载令牌身份验证,我尝试配置我的GRPC客户端以自动注入JWT令牌。 但它被Grpc.Core中的一个例外“提供的通道凭据不允许组合”窒息 这是什么意思?我应该如何提供HTTP授权标头?

  • 我正在尝试通过刷新令牌和JWT在. NET Core 2.1中实现基于令牌的身份验证。 这就是我实施JWT令牌的方式: 启动.cs 令牌生成: 我正在给他回复正确的数值。 但是一分钟后,我在 Postman 中为授权设置了相同的令牌,它可以工作。如果令牌已过期,则不应过期。 我使用不记名令牌作为认证。 我做错了什么?需要方向。

  • 我已经看了很长一段时间了,在互联网上浏览了所有不同的帖子,看看是否能找到有相同问题的人,但不知为什么,我似乎是唯一有这个问题的人。 我有一个ASP。net核心服务器,运行Grpc的基本迎宾服务。使用程序“BloomRPG”调用此服务器效果很好,而且响应时间也很长。然而,当我试图从自己编写的(非常基本的)客户机上执行同样的操作时,我会遇到以下错误: 在客户机上: dbug:Grpc。网客户内部的Gr