[英]Grpc.Core.RpcException: 'Status (StatusCode = "Unavailable", Detail = "Error starting gRPC call
[英]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.