将 gRPC 服务添加到 ASP.NET Core 应用

gRPC 需要gRPC包。

配置 gRPC

在 Startup.cs 中:

  • gRPC 是通过AddGrpc方法启用的。
  • 每个 gRPC 服务通过MapGrpcService方法添加到路由管道。
C#复制
 
 
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

gRPC 要求 HTTP/2。 gRPC for ASP.NET Core 验证HttpRequestHTTP/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 终结点:

JSON复制
 
{
"Kestrel": {
"Endpoints": {
"HttpsInlineCertFile": {
"Url": "https://localhost:5001",
"Protocols": "Http2",
"Certificate": {
"Path": "<path to .pfx file>",
"Password": "<certificate password>"
}
}
}
}
}

或者,可以在Program.cs中配置 Kestrel 终结点:

C#复制
 
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 容器解析记录器服务:

C#复制
public class GreeterService : Greeter.GreeterBase
{
public GreeterService(ILogger<GreeterService> logger)
{
}
}

默认情况下, gRPC 服务实现可以解析具有任意生存期 (单独、作用域或暂时性) 的其他 DI 服务。

解析 gRPC 方法中的 HttpContext

GRPC API 提供对某些 HTTP/2 消息数据 (如方法、主机、标头和尾部) 的访问权限。 通过传递给每ServerCallContext个 gRPC 方法的参数访问:

C#复制
 
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

C#复制
 
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
});
}
}

Azure 应用服务不支持 gRPC

最新文章

  1. MFC字符串转化成16进制
  2. xenomai安装
  3. 初识view
  4. javascript往textarea追加内容
  5. C#多线程交替赋值取值
  6. redis 性能监控和排查
  7. ORA-22275: invalid LOB locator specified
  8. 原生js 学习之array 数组
  9. API和DLL
  10. CentOS 6下的VPN搭建
  11. 【国家集训队2012】tree(伍一鸣)
  12. java书写、数据类型、数组定义
  13. 【转】mysql索引使用技巧及注意事项
  14. SQL Server系统视图sys.master_files不能正确显示数据库脱机状态
  15. 吴恩达Machine Learning 第一周课堂笔记
  16. [转]语音识别中区分性训练(Discriminative Training)和最大似然估计(ML)的区别
  17. Java框架之Spring(三)
  18. 利用Python做绝地科学家(外挂篇)
  19. 卡尔曼滤波算法--核心公式推导导论 - ZZ
  20. Saving Princess claire_(hdu 4308 bfs模板题)

热门文章

  1. Oracle数据库本地和远程导入、导出
  2. 20191121-5 Scrum立会报告+燃尽图 01
  3. 2.基于AOP自定义注解Annotation的实现
  4. 对于ssh服务的简单配置,似的自己的服务器更加安全
  5. Sqlite轻量级数据库
  6. umask 介绍
  7. java IO流的API
  8. Java数组(3):创建测试数据
  9. Django之contenttypes组件
  10. 【AMAD】django-cities -- 为Django项目提供国家,城市数据