【发布时间】:2020-10-05 00:45:42
【问题描述】:
目前我正在对 .Net Core 3.1 和 Grpc/Protobuf 进行一些试验。我为机器人定义了一个原型接口,它为客户端和服务器生成 Grpc 代码。从我在文档中读到的内容是,客户端和服务器之间的连接由 GrpcChannel 维护。
_grpcChannel = GrpcChannel.ForAddress("https://localhost:5001");
_grpcRobotClient = new Robot.RobotClient(_grpcChannel);
上面的代码只接触过一次,所以实际上只有一个_grpcRobotClient,使用一个_grpcChannel。我现在希望来自该客户端的每个调用都到达相同的(实例)服务器端点,该端点是在我的 Grpc 服务器的 Startup.cs 中创建的,非常类似于互联网上的“GreetingService”示例(不幸的是似乎是唯一的好例子):
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<RobotService>();
});
}
RobotService 类有一个构造函数,它建立了一个与机器人的连接——你猜对了——机器人。当然,我希望这个机器人连接是持久的。我所看到的是,对于 GrpcChannel 上的每个请求,都会创建一个新的 GrpcService 实例,因此我当前的机器人连接被释放。
我已经能够通过将机器人连接设置为 RobotService 的静态属性来解决此问题,但这不应该是必需的,对吧?我的意思是,这太恶心了。没必要跟我讲这些。
所以,我要么在我的服务器端点设置中遗漏了一些重要的东西,要么我必须配置一些额外的 ChannelOptions - 也许?有人知道这里出了什么问题吗?
【问题讨论】:
-
在 grpc-dotnet 中,默认情况下,服务是使用“作用域”生命周期创建的。这可以在 ASP.NET Core 级别进行配置(与配置 DI 提供的任何其他组件的方式相同)。有关其他文档,请参阅 docs.microsoft.com/en-us/aspnet/core/grpc/…。
-
谢谢 Jan,这正是我需要的信息。不知何故,我在寻求答案时错过了这个 Microsoft 页面。
标签: .net-core grpc endpoint proto