簡體   English   中英

Grpc.Core.RpcException:'狀態(狀態代碼=“不可用”,詳細信息=“空更新”,

[英]Grpc.Core.RpcException: 'Status(StatusCode=“Unavailable”, Detail=“Empty update”,

我的 GRPC 客戶端與我的服務器通信時拋出以下異常。 我收集異常意味着建立了連接但服務器出錯?

Grpc.Core.RpcException: 'Status(StatusCode="Unavailable", Detail="Empty update", DebugException="Grpc.Core.Internal.CoreErrorDetailException: {"created":"@1615327484.993000000","description":"失敗選擇子頻道","file":"......\src\core\ext\filters\client_channel\client_channel.cc","file_line":5397,"referenced_errors":[{"created":"@1615327484.993000000 ","description":"空更新","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 初始化,但 serviceImpl 是 null。 這是預期的嗎?

   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));
    }

我想出了如何添加客戶端日志記錄,該日志記錄產生以下跟蹤,表明證書配置不起作用。

Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "DEBUG"); // 啟用跟蹤

D0310 09:57:30.795179 Grpc.Core.Internal.UnmanagedLibrary 嘗試加載本機庫“C:\Work\Petri\LicenseClient\LicTester\bin\x64\Debug\grpc_csharp_ext.x64.dll” D0310 09:57:30.849621 Grpc。 Core.Internal.NativeExtension gRPC 本機庫已成功加載。 D0310 09:57:30.858597 0......\src\core\ext\filters\client_channel\lb_policy_registry.cc:42:為“grpclb”注冊 LB 策略工廠 D0310 09:57:30.858597 0..... .\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: 為“priority_experimental”注冊 LB 策略工廠 D0310 09:57:30.858597 0......\src\core\ext\filters\client_channel\ lb_policy_registry.cc:42: 為“weighted_target_experimental”注冊 LB 策略工廠 D0310 09:57:30.858597 0......\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: 為“注冊 LB 策略工廠” pick_first" D0310 09:57:30.859599 0......\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: 為“round_robin”注冊 LB 策略工廠 D0310 09:57:30.859599 0... ...\src\core\ext\filters\client_channel\resolver\dns\c_ares\dns_resolver_ares.cc:491:使用 ares dns 解析器 D0310 09:57:30.860592 0......\src\core\ext\ xds\certificate_provider_registry.cc:33:注冊證書prov “file_watcher”的 ider factory D0310 09:57:30.861589 0......\src\core\ext\filters\client_channel\lb_policy_registry.cc:42:為“cds_experimental”注冊 LB 策略工廠 D0310 09:57:30.861589 0......\src\core\ext\filters\client_channel\lb_policy_registry.cc:42: 為“xds_cluster_impl_experimental”注冊 LB 策略工廠 D0310 09:57:30.861589 0......\src\core\ ext\filters\client_channel\lb_policy_registry.cc:42: 為“xds_cluster_resolver_experimental”注冊 LB 策略工廠 D0310 09:57:30.861589 0......\src\core\ext\filters\client_channel\lb_policy_registry.cc:42:為“xds_cluster_manager_experimental”E0310 09:57:30.979025 0......\src\core\tsi\ssl_transport_security.cc:761 注冊 LB 策略工廠:無法加載任何根證書。 E0310 09:57:30.979025 0......\src\core\tsi\ssl_transport_security.cc:1955:無法加載服務器根證書。 E0310 09:57:30.979025 0......\src\core\lib\security\security_connector\ssl\ssl_security_connector.cc:116:握手器工廠創建失敗並出現 TSI_INVALID_ARGUMENT。 E0310 09:57:30.980022 0......\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:107:無法為安全名稱“127.0.0.1:59740”創建安全子通道 E0310 09:57:30.980022 0......\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:49:在子通道創建期間無法創建通道參數。 E0310 09:57:31.027897 0......\src\core\tsi\ssl_transport_security.cc:761:無法加載任何根證書。 E0310 09:57:31.027897 0......\src\core\tsi\ssl_transport_security.cc:1955:無法加載服務器根證書。 E0310 09:57:31.030887 0......\src\core\lib\security\security_connector\ssl\ssl_security_connector.cc:116:握手器工廠創建失敗,出現 TSI_INVALID_ARGUMENT。 E0310 09:57:31.040860 0......\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:107:無法為安全名稱“127.0.0.1:59740”創建安全子通道 E0310 09:57:31.040860 0......\src\core\ext\transport\chttp2\client\secure\secure_channel_create.cc:49:在子通道創建期間無法創建通道參數。

我遇到了這個問題,直到我發現在創建客戶端時,您需要傳遞與用於創建服務器的證書文件相同的證書文件。

如果您不通過任何證書文件,將使用默認的根證書文件,而在我的機器上我沒有任何根證書。 我看到了關於無法加載任何根證書的相同錯誤。

此外,在創建到服務器的通道時,客戶端必須使用與創建服務器證書相同的“通用名稱”( www.example.com )。 否則服務器將拒絕 SSL 連接請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM