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 應用