Размещение как службы GRPC, так и контроллера REST в приложении ASP.NET Core 5.0

У меня есть служба GRPC, написанная на ASP.NET Core 5.0, и я хотел добавить классический контроллер REST, чтобы изучить его внутреннее состояние на этапе разработки.

К сожалению, у меня возникают проблемы с маршрутизацией.

Это соответствующий раздел конечной точки класса Startup

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers();

    endpoints.MapGrpcService<TestProviderService>();

    endpoints.MapGet("/", async context =>
    {
        context.Response.Redirect("/docs/index.html");
    });
});

Контроллер доступен при нажатии /values/, но не может найти действие при попытке исследовать конкретный ресурс /values/123 или /values/1234/2345. (В моем реальном случае идентификаторы - это идентификаторы GUID, а не целые числа, если это имеет значение).

Все работает, как ожидалось, когда я комментирую

endpoints.MapGrpcService<TestProviderService>();

Я также попытался включить HTTP 1 и HTTP 2 бок о бок, выполнив

webBuilder.UseStartup<Startup>()
          .ConfigureKestrel(options => options.ConfigureEndpointDefaults(o => o.Protocols = HttpProtocols.Http1AndHttp2));

Но и это не помогло.

Спасибо за вашу помощь!


person Kralizek    schedule 12.04.2021    source источник
comment
Можете ли вы поделиться контроллером? это вероятно связано с конфигурацией маршрута   -  person Martin Ullrich    schedule 12.04.2021


Ответы (1)


Мы начали с решения Blazor на стороне клиента и добавили к нему интерфейс GRPC. Это может привести к желаемому результату. Кстати, мы также добавили к этому чванство.

В CreateHostBuilder (program.cs) мы добавили UseUrls (https: // localhost: 44326, https: // localhost: 6000). HTML обслуживается с 44326, а GRPC - с порта 6000.

private static IHostBuilder CreateHostBuilder(string[] args, WebApiClient webApiClient) =>
        Host.CreateDefaultBuilder(args)
            .ConfigureWebHostDefaults(webBuilder =>
            {
                webBuilder.UseStartup<Startup>()
                    .UseKestrel()
                    .UseUrls("https://localhost:44326", "https://localhost:6000");
            }).ConfigureServices((IServiceCollection services) => {
                services.AddSingleton(webApiClient);
            });

Startup добавляет Grpc и RazorPages и так далее. В Configure мы сопоставляем реализацию GRPC с портом 6000:

       public void ConfigureServices(IServiceCollection services)
    {
        services.AddGrpc();
        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();
        app.UseAuthentication();
        app.UseAuthorization();
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapHub<ServerUpdatesHub>("/ServerUpdatesHub");
            endpoints.MapControllers();
            endpoints.MapFallbackToFile("index.html");
            endpoints.MapGrpcService<MyGRPCService>().RequireHost($"*:6000");
            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");
            });
        });
    }
person Robert    schedule 28.04.2021
comment
Супер спасибо! Вы пробовали, чтобы две службы отвечали на один и тот же порт? - person Kralizek; 28.04.2021