自托管Grpc.Core.Server支持Grpc-web客户端的实现方案咨询
问题1解答:Grpc.Core.Server是否支持Grpc-web客户端
不支持。Grpc.Core.Server基于原生C-core gRPC库实现,仅支持标准HTTP/2 gRPC协议,没有内置gRPC-web请求的转码能力,官方也未提供适配该服务端的gRPC-web扩展组件,无法直接对接gRPC-web客户端。
问题2解答:自托管支持Grpc-web的gRPC服务方案
优先推荐自托管AspNetCore方案,该方案完全符合不依赖IIS、可托管为Windows服务的要求,实现成本极低,且同时兼容.NET Framework 4.8运行环境和后续.NET Core迁移需求。
实现步骤
- 第一步:安装所需NuGet包
分别安装Grpc.AspNetCore、Grpc.AspNetCore.Web,如果使用CodeFirst模式开发gRPC服务,保留原有使用的CodeFirst相关依赖即可。注意.NET Framework 4.8环境下选择适配的3.1 LTS版本即可,该版本为官方支持的可在.NET Framework上运行的稳定版本。 - 第二步:编写自托管服务代码
无需修改原有gRPC服务实现逻辑,仅替换原有服务托管代码即可,示例如下:
上述代码会启动Kestrel服务器托管gRPC服务,中间件会自动完成gRPC-web请求到标准gRPC请求的转码,程序可直接注册为Windows服务运行,无需依赖IIS。后续迁移到.NET Core/.NET 5+时,仅需修改项目目标框架,托管代码几乎无需调整。var host = Host.CreateDefaultBuilder() .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseKestrel() // 配置服务监听地址和端口 .UseUrls("http://0.0.0.0:50051") .Configure(app => { // 启用gRPC-web转码中间件 app.UseGrpcWeb(); app.UseRouting(); app.UseEndpoints(endpoints => { // 绑定你的gRPC服务实现类,启用gRPC-web支持 endpoints.MapGrpcService<你的服务实现类>().EnableGrpcWeb(); // 若使用CodeFirst模式,替换为对应CodeFirst的服务映射方法即可 }); }); }) // 开启Windows服务托管支持 .UseWindowsService() .Build(); host.Run(); - 第三步:客户端代码无需调整
你原有添加GrpcWebHandler的客户端代码可直接正常运行,不会再抛出协议错误异常。
备选方案:Envoy Sidecar代理
如果确实不想引入AspNetCore托管逻辑,可使用Envoy作为轻量sidecar和你的现有服务部署在同一服务器上,仅需简单配置即可实现gRPC-web请求到标准gRPC请求的转码,无需修改现有Grpc.Core.Server的服务端代码。该方案需要额外维护一个Envoy进程,适合无法调整现有服务托管逻辑的场景。
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

