使用AddCodeFirstGrpcClient时配置共享gRpc通道的多客户端方法
Blazor WebAssembly中复用gRPC通道的代码优先实现方案
在Blazor WebAssembly场景下,针对同一服务器上的多个gRPC服务,复用单一通道是符合最佳实践的做法——既能减少资源消耗,也能统一配置(如GrpcWebHandler、请求凭据设置等)。以下是具体实现步骤:
1. 注册共享的通道与处理器配置
首先创建并注册统一的请求处理器和gRPC通道,确保所有客户端共用相同配置:
var builder = WebAssemblyHostBuilder.CreateDefault(args); builder.RootComponents.Add<App>("#app"); builder.RootComponents.Add<HeadOutlet>("head::after"); // 创建自定义DelegatingHandler,设置浏览器请求凭据 var credentialsHandler = new DelegatingHandler { InnerHandler = new HttpClientHandler() }; credentialsHandler.SendAsync = async (request, cancellationToken) => { request.SetBrowserRequestCredentials(BrowserRequestCredentials.Include); return await base.SendAsync(request, cancellationToken); }; // 配置GrpcWebHandler,结合自定义凭据处理器 var grpcWebHandler = new GrpcWebHandler(GrpcWebMode.GrpcWebText, credentialsHandler); // 创建共享通道并注册为单例 var sharedChannel = GrpcChannel.ForAddress( builder.HostEnvironment.BaseAddress, new GrpcChannelOptions { HttpHandler = grpcWebHandler } ); builder.Services.AddSingleton(sharedChannel);
2. 为多个gRPC客户端复用共享通道
通过AddCodeFirstGrpcClient注册客户端时,指定复用已注册的共享通道,而非单独设置地址:
// 注册产品服务客户端,复用共享通道 builder.Services.AddCodeFirstGrpcClient<IProductService>() .ConfigureChannel((sp, options) => { options.Channel = sp.GetRequiredService<GrpcChannel>(); }); // 注册订单服务客户端,同样复用共享通道 builder.Services.AddCodeFirstGrpcClient<IOrderService>() .ConfigureChannel((sp, options) => { options.Channel = sp.GetRequiredService<GrpcChannel>(); });
关键说明
- 此方式下所有gRPC客户端都会使用同一个通道实例,共享地址、GrpcWebHandler及凭据配置;
- 避免了
AddCodeFirstGrpcClient单独设置Address时自动创建独立通道的问题; - 单例模式的通道会在应用生命周期内保持复用,完全符合gRPC通道复用的最佳实践。
内容的提问来源于stack exchange,提问作者Vyrotek
相关产品推荐
相关产品推荐

