Grpc.Core.RpcException: 'Status(StatusCode="Unavailable", 详细信息="Empty update",
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":"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 初始化,但 serviceImpl 为空。这是预期的吗?
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"); // 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.
我一直遇到这个问题,直到我发现在创建客户端时,您需要传递与用于创建服务器的证书文件相同的证书文件。
如果不传递任何证书文件,将使用默认的根证书文件,而在我的机器上我没有任何根证书。我看到了关于无法加载任何根证书的相同错误。
此外,在创建到服务器的通道时,客户端必须使用用于创建服务器通道的相同“通用名称”(www.example.com)证书。否则服务器将拒绝 SSL 连接请求。
我的 GRPC 客户端在与我的服务器通信时抛出以下异常。我收集到异常意味着已建立连接但服务器出错?
Grpc.Core.RpcException: 'Status(StatusCode="Unavailable", Detail="Empty update", DebugException="Grpc.Core.Internal.CoreErrorDetailException: {"created":"@1615327484.993000000","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 初始化,但 serviceImpl 为空。这是预期的吗?
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"); // 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.
我一直遇到这个问题,直到我发现在创建客户端时,您需要传递与用于创建服务器的证书文件相同的证书文件。
如果不传递任何证书文件,将使用默认的根证书文件,而在我的机器上我没有任何根证书。我看到了关于无法加载任何根证书的相同错误。
此外,在创建到服务器的通道时,客户端必须使用用于创建服务器通道的相同“通用名称”(www.example.com)证书。否则服务器将拒绝 SSL 连接请求。