将 gRPC 服务添加到 ASP.NET Core 应用
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>();
});
}
}
其他请求处理程序 (如 MVC 控制器) 与已配置的 gRPC 服务并行工作。
配置 Kestrel
Kestrel gRPC 终结点:
- 需要 HTTP/2。
- 传输层安全性(TLS)来保护。
HTTP/2
HttpRequest为HTTP/2。
默认情况下,Kestrel 终结点配置为支持 HTTP/1.1 和 HTTP/2 连接。
TLS
https前缀验证 Kestrel 终结点是否正在使用 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>();
});
协议协商
此协商确定连接是使用 HTTP/1.1 还是 HTTP/2。
到不安全终结点的所有连接默认为 HTTP/1.1,并且 gRPC 调用失败。
Kestrel 终结点配置。
备注
无法在 macOS 上启用 ASP.NET Core gRPC 应用。
与 ASP.NET Core Api 集成
例如, 服务实现可以通过构造函数从 DI 容器解析记录器服务:
复制
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}
默认情况下, gRPC 服务实现可以解析具有任意生存期 (单独、作用域或暂时性) 的其他 DI 服务。
解析 gRPC 方法中的 HttpContext
通过传递给每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
});
}
}
扩展方法提供对在 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
});
}
}