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

  

原文地址:https://www.cnblogs.com/dhqy/p/14108849.html