【发布时间】:2021-08-03 21:36:12
【问题描述】:
我正在尝试查询一些在 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" });
}
但它抛出了这个错误:
“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: 一个错误 发送请求时发生。 ---> System.Net.Http.Http2ConnectionException:HTTP/2 服务器发送 连接上的无效数据。 HTTP/2 错误代码“PROTOCOL_ERROR” (0x1)。
不幸的是,目前我们无法添加 SSL 证书,并且我们需要使用纯 HTTP 一段时间(服务应用程序尚未投入生产)。有人知道这里发生了什么吗?
根据documentation,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>
【问题讨论】:
-
您可以解决它。请阅读我提供的链接。我过去已经这样做了
-
@phuzi 不正确; gRPC 和 HTTP/2 在没有 TLS 的情况下也能正常工作 - 只是不推荐,需要一个选择加入开关
-
链接失效
-
链接已修复,指向 ms doc
标签: c# asp.net-core .net-core grpc