web-dev-qa-db-ja.com

GRPCとWebAPIアプリをC#で.NET Core 3.0にまとめることができますか?

DOT Net Core 3.0を使用しています。

GRPCアプリがあります。 GRPCプロトコルを通じて通信することができます。

私は私の次のステップがいくつかのRESTFUL APIサポートを追加すると思いました。ブラウザを使用してAPIに移動しようとすると、どのプロトコル(HTTP/HTTPS)とポートを使用しても、エラー "err_invalid_http_response"を取得します。 GRPCは8001を使用して5001とWebAPIを使用する必要があります。

私のスタートアップクラスを対象

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"; } 
}
 _

何かご意見は?

Thx

〜#〜]編集[〜#〜]:プロジェクト全体が このレポ で見つけることができます。

〜#〜]編集[〜#〜]:画面の表示 enter image description here

7

私は解決策を見つけました。私はMacOS上で実行されているとKestrelを使っていたと言及していませんでした(そしてそれはMacOSとKestrelの組み合わせが問題です)。その欠けている情報をお詫び申し上げます。

解決策は、 ここ と似ています。 WebAPIポートにoptions.ListenLocalhostへの呼び出しを追加する必要がありました。

これがコードです:

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>();
            });
    }
}

Thx

4