Grpc.Core.RpcException: 'Status (StatusCode = "不可用", Detail = "启动 gRPC 调用时出错

Бор*_*кий 6 c# visual-studio grpc asp.net-core worker-service

如果您能告诉我导致问题的原因以及如何解决它,我将不胜感激。

\n

PS 抱歉发布所有代码,只是我不确定哪个确切部分与问题相关。

\n

以下是异常的全文:

\n
\n

Grpc.Core.RpcException: 'Status (StatusCode = "不可用", Detail = "启动 gRPC 调用时出错。HttpRequestException: 未建立连接,因为目标计算机拒绝了连接请求。SocketException: 未建立连接。目标计算机拒绝了连接请求。", DebugException = "System.Net.Http.HttpRequestException: 由于目标计算机拒绝了连接请求,因此未建立连接。\n\xe2\x80\x94-> System.Net.Sockets.SocketException ( 10061): 连接未建立,因为目标计算机拒绝了连接请求。\nat System.Net.Http.ConnectHelper.ConnectAsync (String host, Int32 port, CancellationToken CancellationToken)\n\xe2\x80\x94- 内部异常堆栈结束跟踪\xe2\x80\x94-\nat System.Net.Http.ConnectHelper.ConnectAsync(字符串主机,Int32端口,CancellationToken取消令牌)\nat System.Net.Http.HttpConnectionPool.ConnectAsync(HttpRequestMessage请求,布尔值allowHttp2,CancellationToken取消令牌) \nat System.Net.Http.HttpConnectionPool.GetHttp2ConnectionAsync(HttpRequestMessage 请求,CancellationToken CancelationToken)\nat System.Net.Http.HttpConnectionPool.SendWithRetryAsync(HttpRequestMessage 请求,布尔 doRequestAuth,CancellationToken CancellationToken)\nat System.Net.Http.RedirectHandler.SendAsync (HttpRequestMessage 请求,CancellationToken CancellationToken)\nat Grpc.Net.Client.Internal.GrpcCall 2.RunCall (HttpRequestMessage request, Nullable1 超时) ") '

\n
\n

这是服务器代码:

\n

程序.cs

\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\n\nnamespace GrpcHostServer\n{\n    public class Program\n    {\n        public static void Main(string[] args)\n        {\n            CreateHostBuilder(args).Build().Run();\n        }\n\n        public static IHostBuilder CreateHostBuilder(string[] args) =>\n            Host.CreateDefaultBuilder(args)\n                .ConfigureServices(services =>\n                {\n                    services.AddHostedService<Worker>();\n                });\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

工人.cs

\n
using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading;\nusing System.Threading.Tasks;\nusing GrpcHostServer.Services;\nusing Microsoft.AspNetCore.Builder;\nusing Microsoft.AspNetCore.Hosting;\nusing Microsoft.AspNetCore.Server.Kestrel.Core;\nusing Microsoft.Extensions.DependencyInjection;\nusing Microsoft.Extensions.Hosting;\nusing Microsoft.Extensions.Logging;\n\nnamespace GrpcHostServer\n{\n    public class Worker : BackgroundService\n    {\n        private readonly ILogger<Worker> _logger;\n\n        public Worker(ILogger<Worker> logger)\n        {\n            _logger = logger;\n        }\n\n        protected override async Task ExecuteAsync(CancellationToken stoppingToken)\n        {\n            await Host.CreateDefaultBuilder()\n                .ConfigureWebHostDefaults(builder =>\n                {\n                    builder\n                        .ConfigureKestrel(options =>\n                        {\n                            options.ListenAnyIP(0, listenOptions =>\n                            {\n                                listenOptions.Protocols = HttpProtocols.Http2;\n                            });\n                        })\n                        .UseKestrel()\n                        .UseStartup<GrpcServerStartup>();\n                })\n                .Build()\n                .StartAsync(stoppingToken);\n        }\n    }\n\n    public class GrpcServerStartup\n    {\n        public void ConfigureServices(IServiceCollection services)\n        {\n            services.AddGrpc();\n\n            services.AddSingleton<GreeterService>();\n        }\n\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\n        {\n            app.UseRouting();\n\n            app.UseEndpoints(endpoints =>\n            {\n                endpoints.MapGrpcService<GreeterService>();\n            });\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

这是客户端代码

\n

程序.cs

\n
using Grpc.Net.Client;\nusing GrpcHostServer;\nusing System;\nusing System.Threading.Tasks;\n\nnamespace GrpcClient\n{\n    class Program\n    {\n        static async Task Main(string[] args)\n        {\n            var input = new HelloRequest { Name = "Boris" };\n            var channel = GrpcChannel.ForAddress("https://localhost:5001");\n            var client = new Greeter.GreeterClient(channel);\n\n            var reply = await client.SayHelloAsync(input);\n\n            Console.WriteLine(reply.Message);\n\n            Console.ReadLine();\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

Бор*_*кий 5

显式侦听服务器中的端口 5001 解决了该问题。