.net core 如何使用HTTPS和我自己的证书将Grpc(netstandard 2.0)与Grpc.Asp.NetCore服务器(.NET 5.0)连接?

.net core 如何使用HTTPS和我自己的证书将Grpc(netstandard 2.0)与Grpc.Asp.NetCore服务器(.NET 5.0)连接?,.net-core,grpc,.net-standard-2.0,.net-5,.net Core,Grpc,.net Standard 2.0,.net 5,我在客户机上遇到此异常: Grpc.Core.rpceException:“状态(Status)(StatusCode=“Unavailable”,Detail=“无法连接到所有地址”,DebugException=“Grpc.Core.Internal.CoreErrorDetailException:{”已创建“@1606620349.107000000”,“说明”:“未能拾取子通道”,“文件”:”T:\src\github\grpc\workspace\u csharp\u ext\u w

我在客户机上遇到此异常:

Grpc.Core.rpceException:“状态(Status)(StatusCode=“Unavailable”,Detail=“无法连接到所有地址”,DebugException=“Grpc.Core.Internal.CoreErrorDetailException:{”已创建“@1606620349.107000000”,“说明”:“未能拾取子通道”,“文件”:”T:\src\github\grpc\workspace\u csharp\u ext\u windows\u x86\src\core\ext\filters\client\u channel\client\u channel.cc,“文件行”:4166,“引用的错误”:[{“创建”:“@1606620349.107000000”,“说明”:“无法连接到所有地址”,“文件”:T:\src\github\grpc\workspace\u csharp\u ext\u windows\u x86\src\core\ext\filters\client\u channel\lb\u policy\pick\u first\pick\u first.cc“,“文件行”:398,“grpc\u状态:14}]”

客户端通道:

        private Channel GetChannel()
    {
        return new Channel(
            _settings.FileServiceUri
            , CertificatePEM == null ? ChannelCredentials.Insecure :
                new SslCredentials(
                    CertificatePEM
                    , new KeyCertificatePair(CertificatePEM, File.ReadAllText("Syrilium.FileUpdater.cer.key"))
                )
            , new[] {
                new ChannelOption(ChannelOptions.MaxReceiveMessageLength,int.MaxValue),
                new ChannelOption(ChannelOptions.MaxSendMessageLength,int.MaxValue),
                }
            );
    }
服务器配置:

        public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .UseServiceProviderFactory(new AutofacServiceProviderFactory())

            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(kestrelOptions =>
                {
                    var sslCertificate = LoadSSLCertificate();
                    kestrelOptions.ListenAnyIP(/*IPAddress.Parse("127.0.0.1"),*/ 5001
                       , listenOptions =>
                       {
                           listenOptions.UseHttps(
                             sslCertificate,
                              httpsOptions =>
                              {
                                  //httpsOptions.SslProtocols = SslProtocols.Tls12;
                                  httpsOptions.ClientCertificateMode = ClientCertificateMode.AllowCertificate;
                                  httpsOptions.ClientCertificateValidation = (certificate, chain, errors) =>
                                  {
                                      return true /*certificate.Thumbprint.Equals(_clientThumbprint, StringComparison.OrdinalIgnoreCase)*/;
                                  };
                              }
                             );
                           listenOptions.Protocols = HttpProtocols.Http2;
                       }
                       );

                });

                webBuilder.UseStartup<Startup>();
            });
在服务器上使用

ChannelCredentials.Insecure
在客户端,它是有效的

如何使用HTTPS和我自己的证书进行通信?这只是一个客户端和服务器在这些最新版本的库上工作的简单示例

有人打电话给我

   httpsOptions.OnAuthenticate = (ctx, auth) => {     };
服务,但我不知道什么,如果有什么有用的,我可以用它吗?
握手失败。

我在包含解决方案的注释后写下解决方案,就像谁读注释一样


问题是.net 5.0客户端速度更快,并且客户端无法连接,因为服务器尚未准备好接受连接。在开发客户机和服务器时,最好有两个共享项目的解决方案,以便可以使用visual studio的两个实例同时调试这两个解决方案。您可以使用多个VS实例打开同一个解决方案,但是您将开始遇到不同的问题,例如在中间窗口和输出窗口中。

源项目127.0.0.1:5001正在侦听?调试时,您可以在VS中启动多个项目,但是,我发现使用相同的VS的两个实例或使用引用相同项目的两个解决方案更容易。有时,客户机在服务准备好应答之前就准备好了通信。如果你的客户端是.NET5,它会更快,你可能会有竞争条件。还要确保端口正确,通常是本地主机的IP,而不是本地主机的IP。请禁用防火墙并重试,确保端口正确,现在您正在连接到端口5001,服务器必须正在侦听该端口。查看事件日志,看看是否有任何提示。您还可以使用邮递员或Fiddler进行连接吗?还确认问题在Grpc(2.33.1)中,因为没有任何代码更改,Grpc.Net.client(2.33.1)的其他客户端连接到同一服务器。您是否在Fiddler中看到请求?如果是,请查看标题是否兼容V1.1或V2等,如果是,请向下滚动到此帖子,并查看标题部分Grpc(2.33.1)没有Fiddler活动,但Grpc.Net.Client(2.33.1)有Fiddler活动。再次使用Thread.Sleep(10000)进行测试,并与telnet连接。在此期间,速度不是问题,问题在于:混合框架,VS或Grpc包。如果是这种情况,则实例2无法解决问题,因为生成的代码是相同的。写一个批处理文件,在没有VS的情况下启动服务的exe,它将连接。包括日志和日志,以控制台它的功能,并在客户端代码中设置断点,以便查看客户端和服务器之间的连接是如何执行的。另外,用小提琴手和现场记录的沟通,让你看到的时间,我已经做了小提琴手,他没有抓住任何东西。如果你愿意,我会给你发送示例项目。我不知道是什么问题,但我肯定不是速度问题,因为我已经测试过了。最明显的是VS问题,毕竟我使用的是预览版。
   httpsOptions.OnAuthenticate = (ctx, auth) => {     };