C#怎么使用gRPC通信 .NET gRPC服务创建与调用方法

14次阅读

.NET中使用gRPC需定义.proto文件、生成代码、配置服务与客户端;注意http/2、TLS、跨平台兼容性;服务端用dotnet new grpc创建,启用AddGrpc()和MapGrpcService();客户端通过Grpcchannel调用,复用通道提升性能。

C#怎么使用gRPC通信 .NET gRPC服务创建与调用方法

在.NET中使用gRPC通信,核心是定义Protocol Buffers(.proto)接口、生成客户端/服务端代码、配置gRPC服务与客户端。整个过程不复杂但容易忽略细节,比如HTTP/2支持、TLS配置或跨平台兼容性。

创建.NET gRPC服务端

使用.NET 6+ SDK可快速搭建gRPC服务:

  • 新建项目:运行 dotnet new grpc -n MyGrpcService
  • 项目默认包含 Protos/greet.protoServices/GreeterService.cs,对应定义的gRPC服务和实现
  • 确保 Program.cs 中已启用gRPC:调用 builder.Services.AddGrpc()app.MapGrpcService()
  • gRPC必须运行在HTTP/2上,默认Kestrel支持;若用iis或反向代理(如nginx),需确认已启用HTTP/2并正确转发

定义和更新.proto文件

所有通信契约由 .proto 文件统一描述,这是gRPC的源头:

  • 放在 Protos/ 目录下,例如 calculator.proto
  • 需声明 syntax = "proto3";,并用 option csharp_namespace 指定C#命名空间
  • 定义 service 时,方法默认为 unary(一发一收),也支持 server streaming、client streaming 和 bidirectional streaming
  • 修改 .proto 后,SDK会自动通过 dotnet-grpc 工具重新生成 C# 代码(需在项目文件中含 项)

从.NET客户端调用gRPC服务

客户端不需要手动处理HTTP/2或序列化,只需引用生成的类型并创建通道:

  • 添加 nuget 包:Grpc.Net.Clientgoogle.Protobuf(若未自动引入)
  • GrpcChannel.ForAddress("https://localhost:5001") 创建安全通道(推荐HTTPS + TLS);开发时若用HTTP,需显式配置 AppContext.Setswitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true)
  • 通过 channel.CreateGrpcService() 获取强类型客户端(需引用服务端生成的 .cs 文件或独立的 Contracts 类库)
  • 直接调用方法,如 var response = await client.AddAsync(new AddRequest { A = 1, B = 2 });,底层自动序列化/反序列化

常见问题与建议

实际使用中几个关键点常被忽视:

  • 证书问题:本地开发用 dotnet dev-certs https --trust 安装自签名证书,否则gRPC over HTTPS会失败
  • 跨语言调用:只要对方按同一 .proto 实现,C#客户端可调用Go/python/Rust等写的gRPC服务,反之亦然
  • 错误处理:gRPC异常统一为 RpcException,可通过 exception.Status.StatusCodeexception.Status.Detail 获取服务端返回的错误码和消息
  • 性能优化:避免在高频调用中反复创建 GrpcChannel,应复用单例通道;如需细粒度控制(如超时、压缩),可通过 ChannelOptions 配置

基本上就这些。掌握 proto 定义、服务注册、通道管理这三环,就能稳定构建和消费.NET gRPC服务。

text=ZqhQzanResources