1. 程式人生 > 實用技巧 >建立可由 JavaScript 呼叫的 C# gRPC 服務

建立可由 JavaScript 呼叫的 C# gRPC 服務

1. 建立 gRPC 服務

  • VSCode 開啟準備用來存放專案資料夾的資料夾;
  • VSCode 中開啟終端,執行命令:
    dotnet new grpc -o grpc-service-web
    code -r grpc-service-web
  • 當對話方塊詢問是否要將所需資產新增到專案時,選擇“是”。

2. 修改服務配置,以支援 Web 呼叫

  gRPC-Web 允許瀏覽器 JavaScript 應用呼叫 gRPC 服務,配置方法如下:

  • Program.cs 檔案中,新增引用:
    using Microsoft.AspNetCore.Server.Kestrel.Core;
    using
    System.Net;
  • Program.cs 檔案中,找到 CreateHostBuilder() 函式,用下面程式碼替換:
    public static IHostBuilder CreateHostBuilder(string[] args) =>
                Host.CreateDefaultBuilder(args)
                    .ConfigureWebHostDefaults(webBuilder =>
                    {
                        webBuilder.ConfigureKestrel(options 
    => { // Setup a Http1AndHttp2 endpoint without TLS. IPAddress ip = Dns.GetHostAddresses("172.22.113.93")[0]; options.Listen(ip, 5000, o => o.Protocols = HttpProtocols.Http1AndHttp2); }); webBuilder.UseStartup
    <Startup>(); });
    View Code
  • 在終端中,執行如下命令(新增對 Grpc.AspNetCore.Web 包的引用)
    dotnet add grpc-service-web.csproj package Grpc.AspNetCore.Web
  • 開啟 Startup.cs 檔案,找到 ConfigureServices() 函式,用下面的程式碼替換:
    public void ConfigureServices(IServiceCollection services)
            {
                services.AddGrpc();
    
                services.AddCors(o => o.AddPolicy("AllowAll", builder =>
                {
                    builder.AllowAnyOrigin()
                        .AllowAnyMethod()
                        .AllowAnyHeader()
                        .WithExposedHeaders("Grpc-Status", "Grpc-Message", "Grpc-Encoding", "Grpc-Accept-Encoding");
                }));
            }
    View Code
  • 開啟 Startup.cs 檔案,找到 Configure() 函式,用下面的程式碼替換:
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
            {
                if (env.IsDevelopment())
                {
                    app.UseDeveloperExceptionPage();
                }
    
                app.UseRouting();
    
                app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });
    
                app.UseCors();
    
                app.UseEndpoints(endpoints =>
                {
                    endpoints.MapGrpcService<GreeterService>().RequireCors("AllowAll");
    
                    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");
                    });
                });
            }
    View Code

3. 執行服務

  • 終端中,執行命令:
    dotnet run
  • 輸出如下:

   

  

注1:Win10 之前的作業系統(macOS、Win7 等)不支援 TLS;

注2:基於瀏覽器的應用 不支援 http2 。

參考:在 ASP.NET Core 中建立 gRPC 客戶端和伺服器

   無法在 Win7/macOS 上啟動 ASP.NET Core gRPC 應用

   在瀏覽器應用中使用 gRPC