創建可由 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

 

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM