当前位置: 首页 > 知识库问答 >
问题:

Grpc.Core.RpcException:'状态(StatusCode="不可用", Detail="空更新",

鄢开诚
2023-03-14

我的GRPC客户端在与我的服务器对话时抛出了以下异常。我推测这个异常意味着连接建立了,但是服务器出错了?

Grpc.Core.RpcException: 'Status(StatusCode=“Unavailable”, Detail=“Empty update”, DebugException=“Grpc.Core.Internal.CoreErrorDetailException: {”created“:”@1615327484.99300000“,”description“:”Failed to pick subchannel“,”file“:”......\src\core\ext\filters\client_channel\client_channel.cc“,”file_line“:5397,”referenced_errors“:[{”created“:”@1615327484.993000000“,”description“:”Empty update“,”file“:”......\src\core\ext\filters\client_channel\lb_policy\pick_first\pick_first.cc“,”file_line“:201,”grpc_status“:14}]}”)'

服务器的配置如下。我错过了什么吗?

public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.ConfigureKestrel(options =>
            {
                options.Listen(IPAddress.Loopback, BINDING_PORT, configure => 
                { 
                    configure.UseHttps(GetCertificate());
                    configure.Protocols = Microsoft.AspNetCore.Server.Kestrel.Core.HttpProtocols.Http2;
                });
            });

            webBuilder.UseStartup<Startup>();
        }).UseWindowsService();

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }

    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapGrpcService<LicenseService>().RequireHost($"*:{Program.BINDING_PORT}");

        endpoints.MapGet("/", async context =>
        {
            await context.Response.WriteAsync("Communication with gRPC endpoints must be made through a gRPC client. To learn how to create a client, visit: https://go.microsoft.com/fwlink/?linkid=2086909");
        });
    });
}

我注意到服务器通过BindService初始化,但服务Impl为空。这是意料之中的吗?

   public static void BindService(grpc::ServiceBinderBase serviceBinder, LicensesBase serviceImpl)
    {
      serviceBinder.AddMethod(__Method_GetLicense, serviceImpl == null ? null : new grpc::UnaryServerMethod<global::LicenseService.LicRequest, global::LicenseService.LicReply>(serviceImpl.GetLicense));
    }

共有2个答案

呼延聪
2023-03-14

我遇到了这个问题,直到我发现在创建客户端时,需要传递与创建服务器所用的证书文件相同的证书文件。

如果您没有传递任何证书文件,将使用默认的根证书文件,并且在我的机器上我没有任何根证书。我看到了关于无法加载任何根证书的相同错误。

此外,在创建到服务器的通道时,客户端必须使用用于创建服务器证书的相同“公用名”(www.example.com)。否则,服务器将拒绝 SSL 连接请求。

茹康裕
2023-03-14

我想出了如何添加客户端日志记录,该日志记录生成了以下跟踪,指示证书预配不起作用。

Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG"); // enable traces


D0310 09:57:30.795179 Grpc.Core.Internal.UnmanagedLibrary Attempting to load native library "C:\Work\Petri\LicenseClient\LicTester\bin\x64\Debug\grpc_csharp_ext.x64.dll"
D0310 09:57:30.849621 Grpc.Core.Internal.NativeExtension gRPC native library loaded successfully.
D0310 09:57:30.858597 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "grpclb"
D0310 09:57:30.858597 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "priority_experimental"
D0310 09:57:30.858597 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "weighted_target_experimental"
D0310 09:57:30.858597 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "pick_first"
D0310 09:57:30.859599 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "round_robin"
D0310 09:57:30.859599 0 ..\..\..\src\core\ext\filters\client_channel\resolver\dns\c_ares\dns_resolver_ares.cc:491: Using ares dns resolver
D0310 09:57:30.860592 0 ..\..\..\src\core\ext\xds\certificate_provider_registry.cc:33: registering certificate provider factory for "file_watcher"
D0310 09:57:30.861589 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "cds_experimental"
D0310 09:57:30.861589 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "xds_cluster_impl_experimental"
D0310 09:57:30.861589 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "xds_cluster_resolver_experimental"
D0310 09:57:30.861589 0 ..\..\..\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: registering LB policy factory for "xds_cluster_manager_experimental"
E0310 09:57:30.979025 0 ..\..\..\src\core\tsi\ssl_transport_security.cc:761: Could not load any root certificate.
E0310 09:57:30.979025 0 ..\..\..\src\core\tsi\ssl_transport_security.cc:1955: Cannot load server root certificates.
E0310 09:57:30.979025 0 ..\..\..\src\core\lib\security\security_connector\ssl\ssl_security_connector.cc:116: Handshaker factory creation failed with TSI_INVALID_ARGUMENT.
E0310 09:57:30.980022 0 ..\..\..\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:107: Failed to create secure subchannel for secure name '127.0.0.1:59740'
E0310 09:57:30.980022 0 ..\..\..\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:49: Failed to create channel args during subchannel creation.
E0310 09:57:31.027897 0 ..\..\..\src\core\tsi\ssl_transport_security.cc:761: Could not load any root certificate.
E0310 09:57:31.027897 0 ..\..\..\src\core\tsi\ssl_transport_security.cc:1955: Cannot load server root certificates.
E0310 09:57:31.030887 0 ..\..\..\src\core\lib\security\security_connector\ssl\ssl_security_connector.cc:116: Handshaker factory creation failed with TSI_INVALID_ARGUMENT.
E0310 09:57:31.040860 0 ..\..\..\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:107: Failed to create secure subchannel for secure name '127.0.0.1:59740'
E0310 09:57:31.040860 0 ..\..\..\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:49: Failed to create channel args during subchannel creation.
 类似资料:
  • 我开始使用Grpc框架来实现客户机/服务器之间的一些通信,但我遇到了这个异常: rpc.core.rpcException:'statuscode=unavailable,detail=“Name resolution failure)' 谁能告诉我出了什么问题吗?为什么我无法连接到服务器? 堆栈: 在system.runtime.exceptionServices.exceptionDispat

  • 所以我有这个: 只是一个数组的数字例如然而没有给出正确的总数,但?我甚至放了一个超时延迟,看看这是否解决了问题。任何明显的还是我应该发布更多的代码?

  • 问题内容: 这是我的代码: 这是我运行文件($ node test.js)时的输出:我在ubuntu机器上尝试了此操作,它运行良好。这就是我在Mac上获得的。有人可以解释一下为什么会这样。任何帮助,将不胜感激。 问题答案: Http响应状态应为整数。它不能是字符串,对象,数组等,并且应从100开始。 从您的代码中,我看到您尝试做 检查回复变量。从redis incr响应中,我认为它是字符串“ OK

  • 我试图将“加载”的状态从true更改为false,但当我调用一个函数并在该函数中设置“this.setState({loading:false})”时,加载状态仍然保持true。 在下面的代码中,当按钮按钮函数被调用时,它将“加载”状态设置为真,但当用户成功登录“加载”状态时,应该变为假,这样我的渲染按钮函数将重新渲染,旋转器可以隐藏自己并显示按钮。 为什么LoginSAccess函数中的“加载”

  • 它几乎添加了一个对象,该对象包含来自主窗体的子窗体的值。 这是我用作按钮的函数的函数。 这将一个新对象添加到一个名为的状态,该状态是一个对象数组。 提前谢了。

  • 说明 支付宝境外到店支付-更新商户二维码状态 官方文档:https://global.alipay.com/service/merchant_QR_Code/34 类 请求参数类 请求参数 类名:\Yurun\PaySDK\AlipayCrossBorder\InStore\ModifyStatus\Request 属性 名称 类型 说明 $service string 接口名称 $timesta