將 gRPC 服務添加到 ASP.NET Core 應用
gRPC 需要gRPC包。
配置 gRPC
在 Startup.cs 中:
- gRPC 是通過
AddGrpc
方法啟用的。 - 每個 gRPC 服務通過
MapGrpcService
方法添加到路由管道。
public class Startup { // This method gets called by the runtime. Use this method to add services to the container. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseEndpoints(endpoints => { // 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 endpoints.MapGrpcService<GreeterService>(); }); } }
ASP.NET Core 中間件和功能共享路由管道, 因此可以將應用配置為提供其他請求處理程序。 其他請求處理程序 (如 MVC 控制器) 與已配置的 gRPC 服務並行工作。
配置 Kestrel
Kestrel gRPC 終結點:
- 需要 HTTP/2。
- 應通過傳輸層安全性(TLS)來保護。
HTTP/2
gRPC 要求 HTTP/2。 gRPC for ASP.NET Core 驗證HttpRequest為HTTP/2
。
在大多數現代操作系統上,Kestrel支持 HTTP/2 。 默認情況下,Kestrel 終結點配置為支持 HTTP/1.1 和 HTTP/2 連接。
TLS
用於 gRPC 的 Kestrel 終結點應使用 TLS 進行保護。 在開發中,將在存在 ASP.NET Core 開發證書https://localhost:5001
時,自動創建一個使用 TLS 保護的終結點。 不需要配置。 https
前綴驗證 Kestrel 終結點是否正在使用 TLS。
在生產環境中,必須顯式配置 TLS。 在下面的appsettings示例中,提供了使用 TLS 保護的 HTTP/2 終結點:
{ "Kestrel": { "Endpoints": { "HttpsInlineCertFile": { "Url": "https://localhost:5001", "Protocols": "Http2", "Certificate": { "Path": "<path to .pfx file>", "Password": "<certificate password>" } } } } }
或者,可以在Program.cs中配置 Kestrel 終結點:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder => { webBuilder.ConfigureKestrel(options => { options.Listen(IPAddress.Any, 5001, listenOptions => { listenOptions.Protocols = HttpProtocols.Http2; listenOptions.UseHttps("<path to .pfx file>", "<certificate password>"); }); }); webBuilder.UseStartup<Startup>(); });
協議協商
TLS 用於保護通信的安全性。 當終結點支持多個協議時,TLS應用層協議協商(ALPN)握手用於協商客戶端與服務器之間的連接協議。 此協商確定連接是使用 HTTP/1.1 還是 HTTP/2。
如果在不使用 TLS 的情況下配置了 HTTP/2 終結點,則終結點的 ListenOptions.Protocols 必須設置為 HttpProtocols.Http2
。 具有多個協議(例如)的終結HttpProtocols.Http1AndHttp2
點不能使用 TLS,因為沒有協商。 到不安全終結點的所有連接默認為 HTTP/1.1,並且 gRPC 調用失敗。
有關通過 Kestrel 啟用 HTTP/2 和 TLS 的詳細信息,請參閱Kestrel 終結點配置。
備注
macOS 不支持 ASP.NET Core gRPC 及 TLS。 在 macOS 上成功運行 gRPC 服務需要其他配置。 有關詳細信息,請參閱無法在 macOS 上啟用 ASP.NET Core gRPC 應用。
與 ASP.NET Core Api 集成
gRPC 服務對 ASP.NET Core 功能 (如依賴關系注入(DI) 和日志記錄) 具有完全訪問權限。 例如, 服務實現可以通過構造函數從 DI 容器解析記錄器服務:
public class GreeterService : Greeter.GreeterBase { public GreeterService(ILogger<GreeterService> logger) { } }
默認情況下, gRPC 服務實現可以解析具有任意生存期 (單獨、作用域或暫時性) 的其他 DI 服務。
解析 gRPC 方法中的 HttpContext
GRPC API 提供對某些 HTTP/2 消息數據 (如方法、主機、標頭和尾部) 的訪問權限。 通過傳遞給每ServerCallContext
個 gRPC 方法的參數訪問:
public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello( HelloRequest request, ServerCallContext context) { return Task.FromResult(new HelloReply { Message = "Hello " + request.Name }); } }
ServerCallContext
在所有 ASP.NET api 中都HttpContext
不提供對的完全訪問權限。 擴展方法提供對在 ASP.NET api 中HttpContext
表示基礎 HTTP/2 消息的完全訪問權限: GetHttpContext
public class GreeterService : Greeter.GreeterBase { public override Task<HelloReply> SayHello( HelloRequest request, ServerCallContext context) { var httpContext = context.GetHttpContext(); var clientCertificate = httpContext.Connection.ClientCertificate; return Task.FromResult(new HelloReply { Message = "Hello " + request.Name + " from " + clientCertificate.Issuer }); } }