作者:John Luo
由于底层堆栈的实现,并非所有功能在基于 C 核的 gRPC应用与基于 ASP.NET Core 的应用程序之间的工作方式相同。 本文档重点介绍两个堆栈之间的迁移的主要区别。
在 ASP.NET Core 堆栈中,默认情况下,使用范围内的生存期创建 gRPC services。 与此相反,默认情况下 gRPC C 核心将绑定到单一实例生存期内的服务。
范围内的生存期允许服务实现使用范围内的生存期解析其他服务。 例如,作用域内的生存期还可以通过构造函数注入解析 DI 容器 DbContext
。 使用范围生存期:
有关服务生存期的详细信息,请参阅 在 ASP.NET Core 依赖注入。
为了促进从 gRPC 的 C 核心实现到 ASP.NET Core 的转换,可以将服务实现的服务生存期从作用域改为单一实例。 这涉及到将服务实现的实例添加到 DI 容器:
public void ConfigureServices(IServiceCollection services) { services.AddGrpc(); services.AddSingleton(new GreeterService()); }
但是,具有单一生存期的服务实现不再能够通过构造函数注入来解析范围内的服务。
在基于 C 的应用程序中,当构造服务器实例时,将在 ChannelOption
配置 grpc.max_receive_message_length
和 grpc.max_send_message_length
等设置。
在 ASP.NET Core 中,gRPC 通过 GrpcServiceOptions
类型提供配置。 例如,可以通过 AddGrpc
配置 gRPC 服务的最大传入消息大小。 下面的示例将默认 MaxReceiveMessageSize
为 4 MB 到 16 MB:
public void ConfigureServices(IServiceCollection services) { services.AddGrpc(options => { options.MaxReceiveMessageSize = 16 * 1024 * 1024; // 16 MB }); }
有关配置的详细信息,请参阅 gRPC for .NET 配置。
基于 C 核的应用依赖于 GrpcEnvironment
来配置记录器,以便进行调试。 ASP.NET Core 堆栈通过日志记录 API提供此功能。 例如,可以通过构造函数注入将记录器添加到 gRPC 服务:
public class GreeterService : Greeter.GreeterBase { public GreeterService(ILogger<GreeterService> logger) { } }
基于 C 核的应用通过服务器端口属性配置 HTTPS。 类似的概念用于在 ASP.NET Core 中配置服务器。 例如,Kestrel 使用终结点配置来实现此功能。
与基于 gRPC 的应用中的侦听器相比,中间件提供的功能类似。 ASP.NET Core ASP.NET Core 中间件和侦听器在概念上类似。 两者:
HttpContext
的访问权限:
HttpContext
是参数。ServerCallContext.GetHttpContext
扩展方法使用 ServerCallContext
参数访问 HttpContext
。 请注意,此功能特定于运行 ASP.NET Core 中的侦听器。gRPC 侦听器与 ASP.NET Core 中间件的不同之处: