c# - 具有未加密 HTTP2 连接的 .Net Core 3.1 gRPC 客户端
问题描述
我正在尝试查询一些在 HTTP 上运行的本地 gRPC 服务。这是我的 net core 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" });
}
但它抛出了这个错误:
System.Private.CoreLib.dll 中出现“Grpc.Core.RpcException”类型的异常,但未在用户代码中处理:“Status(StatusCode="Internal", Detail="Error starting gRPC call。HttpRequestException: 发生错误发送请求时。Http2ConnectionException: HTTP/2 服务器在连接上发送了无效数据。HTTP/2 错误代码 'PROTOCOL_ERROR' (0x1)。", DebugException="System.Net.Http.HttpRequestException: 发送时发生错误请求。---> System.Net.Http.Http2ConnectionException: HTTP/2 服务器在连接上发送了无效数据。HTTP/2 错误代码 'PROTOCOL_ERROR' (0x1)。
不幸的是,目前我们无法添加 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>
解决方案
我不能 100% 确定这适用于您的场景(尽管“Http1 和 Http2”建议:它将适用),但是:我已经看到这个问题与尝试同时服务 HTTP/ 的非 TLS 端点1 和 HTTP/2 流量 - 它有点困惑,并尝试用 HTTP/1 响应来响应 HTTP/2 请求(这不会发生在 TLS 端点上,因为握手的工作方式不同)。就我而言,解决方法是告诉服务器只提供 HTTP/2。这可以在Kestrel
/EndPoints
节点下的 appSettings.json 中通过指定来完成"Protocols": "Http2"
,或者在 Program.cs 中通过listenOptions.Protocols = HttpProtocols.Http2
在ConfigureKestrel
调用中指定来完成。当我想在没有 TLS 的情况下提供 HTTP/1 和 HTTP/2 时,我总是不得不使用不同的端口等。
推荐阅读
- nativescript - Nativescript - 在索引处获取标签 ID
- flutter - 如何在关闭屏幕时关闭打开的 SnackBar?
- sharepoint - Sharepoint 加载项无法在 Sharepoint 根站点集合中安装
- angular - 反应式表单选择控件 - 茉莉花测试失败:找不到不同
- python - 根据按步骤排序的另一个列表对列表进行排序
- .net - 无法在不破坏 Android 和 iOS 项目 (Xamarin.Forms) 的情况下将目标 .NET 框架从 2.0 更改为更高版本
- ruby-on-rails - 仅发送部分表单或嵌套表单
- javascript - 为什么这些 div 不被隐藏和显示?
- memory-management - 为什么第二个变量的地址不在第一个变量之后?
- doctrine - 如果数据不存在,则使用 Symfony 4 创建