Grpc.Core.Channel 和 Grpc.Net.Client.GrpcChannel 之间的区别是什么?

Álv*_*cía 4 c# .net-core grpc asp.net-core

我正在用 Grpc 做一些测试,我意识到有这两种类型的渠道,但我不知道有什么区别。

但是当我使用证书时,使用 Grpc.Net.Client.GrpcChannel 我可以设置证书,但我收到一个错误,表明 DNS 没有解决。如果我使用 Grpc.Core.Channel,我可以调用该服务,但由于证书问题,我收到错误消息 - 基于 TLS 的 HTTP/2 未在仅 HTTP/2 的端点上协商。

2个通道有什么区别?

谢谢。

Fra*_*cis 8

Grpc.Core.Channel 基于 C 核心库,它构成了它支持的所有语言变体(C++、C#、PHP、Objective-C、Python、Ruby 等)的基本代码库

Grpc.Net.Client.GrpcChannel 是为 .NET Core 使用熟悉的 HttpClient 对象构建的,该对象现在支持 Http/2。

grpc-dotnet的主页指出:

适用于 .NET 的 GRPC 不会替换适用于 C# 的 gRPC(基于原生 C 核二进制文件的 gRPC C# API)。这些实现共存并共享许多相同的 API 以避免锁定。目前没有计划用一种实现来取代另一种。gRPC for C# 是 gRPC for .NET 不支持的框架的推荐解决方案,例如 .NET Framework。

当您检查 Grpc.Net.Client.GrpcChannel 的代码时,您可以看到一个内部 Httpclient对象用于进行异步调用和取消挂起的请求。

Grpc.Core.Channel 的代码似乎将其调用委托给本机生成的 grpc 代码。这大约是我在有限的时间里所能花在上面的。

有趣的是,在 Net.Client.GrpcChannel 的 ssl 验证部分,它实际上声明它在异常消息传递中使用了 HttpClient。

if (!string.IsNullOrEmpty(rootCertificates) ||
    keyCertificatePair != null ||
    verifyPeerCallback != null)
{
    throw new InvalidOperationException(
        $"{nameof(SslCredentials)} with non-null arguments is not supported by {nameof(GrpcChannel)}. " +
        $"{nameof(GrpcChannel)} uses HttpClient to make gRPC calls and HttpClient automatically loads root certificates from the operating system certificate store. " +
        $"Client certificates should be configured on HttpClient. See https://aka.ms/AA6we64 for details.");
}
Run Code Online (Sandbox Code Playgroud)