Могу ли я объединить приложение gRPC и webapi в .NET Core 3.0 в C #? - PullRequest
1 голос
/ 31 октября 2019

Я использую dot net core 3.0.

У меня есть приложение gRPC. Я могу общаться с ним по протоколу gRPC.

Я думал, что моим следующим шагом будет добавить некоторую успокоительную поддержку API. Я изменил свой класс запуска для добавления контроллеров, маршрутизации и т. Д. ..... Когда я пытаюсь перейти к API с помощью браузера, я получаю сообщение об ошибке «ERR_INVALID_HTTP_RESPONSE» независимо от того, какой протокол (http / https) и порт я использую. gRPC должен использовать 5001, а webapi - 8001.

Вот мой класс запуска:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
            app.UseDeveloperExceptionPage();

        app.UseRouting();
        app.UseHttpsRedirection();
        app.UseAuthorization();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapGrpcService<BootNodeService>();
            endpoints.MapControllers();

        });
    }
}

И мой контроллер:

[ApiController]
[Route("[controller]")] 
public class AdminController : ControllerBase 
{ 
    [HttpGet] public string Get() 
    { return "hello"; } 
}

Есть мысли?

Thnx

РЕДАКТИРОВАТЬ : весь проект можно найти в репо .

РЕДАКТИРОВАНИЕ : вид экранаenter image description here

1 Ответ

1 голос
/ 01 ноября 2019

Я нашел решение. Я не упомянул, что я работал на MacOS и использовал Kestrel (и, похоже, проблема в сочетании MacOS и Kestrel). Я прошу прощения за эту недостающую информацию.

Решение похоже на то, что здесь . Мне пришлось добавить вызов к options.ListenLocalhost для порта webapi.

вот код:

public class Program
{
    public static void Main(string[] args)
    {
       IHostBuilder hostBuilder = CreateHostBuilder(args);
       IHost host = hostBuilder.Build();
       host.Run();
    }

    // Additional configuration is required to successfully run gRPC on macOS.
    // For instructions on how to configure Kestrel and gRPC clients on macOS, visit https://go.microsoft.com/fwlink/?linkid=2099682
    public static IHostBuilder CreateHostBuilder(string[] args) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.ConfigureKestrel(options =>
                {
                    options.ListenLocalhost(5001, o => o.Protocols =
                        HttpProtocols.Http2);

                    // ADDED THIS LINE to fix the problem
                    options.ListenLocalhost(11837, o => o.Protocols =
                        HttpProtocols.Http1);
                });
                webBuilder.UseStartup<Startup>();
            });
    }
}

Thnx

...