【发布时间】:2020-11-17 16:05:11
【问题描述】:
我在 .NET core 3.1 下创建了一个 GRPC 服务主机(使用来自 https://github.com/grpc/grpc-dotnet 的 Grpc.AspNetCore v2.30)。通过在“ProxyService”构造函数中放置断点,我可以看到每次调用都会实例化该类 - 每次来自客户端的 GRPC 调用时,都会触发断点。如何将其配置为始终使用相同的 ProxyService 实例?
这些是程序和启动类:
class Program
{
const int _port = 23456;
static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
Console.WriteLine("started - press any key to quit...");
Console.ReadKey();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.ConfigureKestrel(options =>
{
options.ConfigureEndpointDefaults(o =>
{
o.Protocols = HttpProtocols.Http2;
});
options.ListenAnyIP(_port);
});
webBuilder.UseStartup<Startup>();
});
}
public class ProxyService : StreamingApi.Protos.StreamingApi.StreamingApiBase
{
public ProxyService()
{
// gets here with every client call
}
public override Task<UpdateResponse> Update(UpdateRequest request, ServerCallContext context)
{
return Task.FromResult(new UpdateResponse());
}
}
class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddGrpc();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapGrpcService<ProxyService>();
});
}
}
【问题讨论】:
-
你为什么要这样做?理想情况下,您的构造函数应该包含零成本逻辑,例如依赖关系链接。其他一切都应该在 Update 方法中或在您的服务启动之前发生。
-
作为起点 - 我想测量处理的调用数量并每 1 秒将它们打印到控制台,因此我无法添加线程以保持不变并在循环中执行此操作。这个可以配置吗?
-
这是共享资源。您应该定义将保存聚合值并且是静态的依赖接口。