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

时间:2019-12-21 19:57:59

标签: c# asp.net-core .net-core grpc

我正在使用Grpc进行一些测试,我意识到存在两种类型的渠道,但是我不知道两者之间的区别。

但是当我使用证书时,可以使用Grpc.Net.Client.GrpcChannel设置证书,但会收到一个错误,指出DNS无法解决。如果我使用Grpc.Core.Channel,则可以调用该服务,但是由于证书的原因,我会收到一个错误,错误是-在仅HTTP / 2的终结点上未协商TLS上的HTTP / 2。

两个频道之间有什么区别?

谢谢。

1 个答案:

答案 0 :(得分:5)

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

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

grpc-dotnet的首页指出:

针对.NET的GRPC不会替代针对C#的gRPC(通过本机实现的gRPC C#API C核心二进制文件)。这些实现共存并共享许多 避免锁定的相同API。目前没有计划 实施以替代另一种。 用于C#的gRPC是 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.");
}