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>(); });
- 在终端中,运行如下命令(添加对 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"); })); }
- 打开 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"); }); }); }
3. 运行服务
- 在终端中,运行命令:
dotnet run
- 输出如下:
注1:Win10 之前的操作系统(macOS、Win7 等)不支持 TLS;
注2:基于浏览器的应用 不支持 http2 。
参考:在 ASP.NET Core 中创建 gRPC 客户端和服务器
无法在 Win7/macOS 上启动 ASP.NET Core gRPC 应用