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

2024-01-29

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

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

以下是异常的全文:

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

这是服务器代码:

程序.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace GrpcHostServer
{
    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices(services =>
                {
                    services.AddHostedService<Worker>();
                });
    }
}

工人.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using GrpcHostServer.Services;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;

namespace GrpcHostServer
{
    public class Worker : BackgroundService
    {
        private readonly ILogger<Worker> _logger;

        public Worker(ILogger<Worker> logger)
        {
            _logger = logger;
        }

        protected override async Task ExecuteAsync(CancellationToken stoppingToken)
        {
            await Host.CreateDefaultBuilder()
                .ConfigureWebHostDefaults(builder =>
                {
                    builder
                        .ConfigureKestrel(options =>
                        {
                            options.ListenAnyIP(0, listenOptions =>
                            {
                                listenOptions.Protocols = HttpProtocols.Http2;
                            });
                        })
                        .UseKestrel()
                        .UseStartup<GrpcServerStartup>();
                })
                .Build()
                .StartAsync(stoppingToken);
        }
    }

    public class GrpcServerStartup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddGrpc();

            services.AddSingleton<GreeterService>();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            app.UseRouting();

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapGrpcService<GreeterService>();
            });
        }
    }
}

这是客户端代码

程序.cs

using Grpc.Net.Client;
using GrpcHostServer;
using System;
using System.Threading.Tasks;

namespace GrpcClient
{
    class Program
    {
        static async Task Main(string[] args)
        {
            var input = new HelloRequest { Name = "Boris" };
            var channel = GrpcChannel.ForAddress("https://localhost:5001");
            var client = new Greeter.GreeterClient(channel);

            var reply = await client.SayHelloAsync(input);

            Console.WriteLine(reply.Message);

            Console.ReadLine();
        }
    }
}

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐