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

.Net Core 3.1 gRPC客户端,具有未加密的HTTP2连接

强安和
2023-03-14

我试图查询一些在HTTP上运行的本地gRPC服务。这是我的网核3.1控制台应用程序:

static async Task Main(string[] args)
{
    AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);

    using var channel = GrpcChannel.ForAddress("http://localhost:16050");
    var client = new EventService.EventServiceClient(channel);
    var reply1 = await client.GetTrackEventAsync(new GetTrackEventRequest { Name = "01Austra14" });
}

但它抛出了这个错误:

类型'Grpc.Core.RpcException'的异常发生在System.Private.CoreLib中.dll但在用户代码中未处理:'Status(StatusCode=“Internal”, Detail=“启动gRPC调用时出错。HttpRequestException:发送请求时出错。Http2ConnectionException:HTTP/2 服务器在连接上发送了无效数据。HTTP/2 错误代码“PROTOCOL_ERROR”(0x1).“,DebugException=”System.Net.Http.HttpRequestException:发送请求时出错。---

不幸的是,目前我们无法添加SSL证书,我们需要使用纯HTTP一段时间(服务应用程序尚未投入生产)。有人知道这里发生了什么吗?

根据留档的AppContext.SetSwitch调用应该就足够了。

该服务器是 Asp Net Core 3.1 应用。它运行在:

  • 端口http://*:16050
  • 端口https://*:16150。这将正确响应客户端,但如上所述,目前只能在本地使用

该服务器提供

  • Http1和Http2
  • 同一端口上的REST API和gRPC API

客户端正在使用以下包

  <ItemGroup>
    <PackageReference Include="Google.Protobuf" Version="3.17.0" />
    <PackageReference Include="Grpc.Net.Client" Version="2.37.0" />
    <PackageReference Include="Grpc.Tools" Version="2.37.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
    </PackageReference>
  </ItemGroup>

共有1个答案

易琨
2023-03-14

我不能100%确定这是否适用于您的场景(尽管“Http1和Http2”表明:它将适用),但是:我在一个试图同时服务HTTP/1和HTTP/2流量的非TLSendpoint上看到了这个问题——它有点困惑,并试图用HTTP/1响应来响应HTTP/2请求(这不会发生在TLSendpoint上,因为握手的工作方式不同)。在我的例子中,修复方法是告诉服务器只提供HTTP/2。这可以在appSettings.json中的< code > Kestrel /< code > EndPoints 节点下通过指定< code>"Protocols": "Http2"来完成,或者在Program.cs中通过指定< code>listenOptions来完成。协议=协议。< code>ConfigureKestrel调用中的Http2。当我想在没有TLS的情况下提供HTTP/1和HTTP/2服务时,我总是不得不使用不同的端口等。

 类似资料:
  • 使用Oracle JDBC客户端库建立Oracle连接时,是否默认加密密码或安全握手?(想知道在使用Oracle JDBC客户端库进行连接时,是否存在通过线路嗅探密码的风险)

  • 我正在尝试访问具有客户端证书的url,并使用以下内容生成密钥: 和密钥存储: 并尝试连接: }

  • 我的未插入 如果没有NIO: 对于每个保持Alive连接,服务器会继续阻塞一个线程。 使用NIO: 此连接器有几个轮询线程,用于为所有连接的用户保持连接活动,同时每当数据(新的HTTP请求)可用时都会调用工作线程 现在:如果我有一个简单的servlet,它向客户端(浏览器)返回一个100 KB的字符串。 如果具有1 KB连接的客户端连接,则需要大约100秒来接收字符串<那么java线程会被阻塞大约

  • 我要创建一个与spring FTPSSessionFactory的ftp连接。 在我的项目中,我将xml配置用于与TLS的ftp连接(它起作用了): 现在我的问题是: 我如何修改xml部分(我猜是用setter)使它同时适用于这两个部分?

  • 我在实现UDP连接时遇到了麻烦,因为当我在局域网内尝试它时,它是有效的,但是当NAT内部的人试图连接到公共服务器地址时,它会失败,因为从服务器作为响应发送的数据包永远不会到达客户端。 我的协议如下: 客户端A向服务器发送一个字节作为连接请求 服务器B为客户端创建一个新的套接字,并从那里向recvfrom()调用中报告的客户端端口响应一个字节。永远不会联系到客户 我也试过: 执行许多调用,每个调用在