【问题标题】:Grpc service in .Net Core is recreated for every client request为每个客户端请求重新创建 .Net Core 中的 Grpc 服务
【发布时间】: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


【解决方案1】:

你需要在端点启用grpc web:

enter code here
 public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
 {
 if (env.IsDevelopment())
 {
    app.UseDeveloperExceptionPage();
 }

 app.UseRouting();
 //missing point
 //app.UseGrpcWeb() and then you can enable on each service by using .EnableGrpcWeb(); 
 //Or enable grpc web for all as below and you might need to use cors too.
 app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true });
 app.UseEndpoints(endpoints =>
 {
    endpoints.MapGrpcService<RobotService>();
 });
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多