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

在.NET中使用gRPC通信,核心是定义Protocol Buffers(.proto)接口、生成客户端/服务端代码、配置gRPC服务与客户端。整个过程不复杂但容易忽略细节,比如HTTP/2支持、TLS配置或跨平台兼容性。
创建.NET gRPC服务端
使用.NET 6+ SDK可快速搭建gRPC服务:
- 新建项目:运行
dotnet new grpc -n MyGrpcService - 项目默认包含
Protos/greet.proto和Services/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.Client和Google.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.StatusCode和exception.Status.Detail获取服务端返回的错误码和消息 -
性能优化:避免在高频调用中反复创建
GrpcChannel,应复用单例通道;如需细粒度控制(如超时、压缩),可通过ChannelOptions配置
基本上就这些。掌握 proto 定义、服务注册、通道管理这三环,就能稳定构建和消费.NET gRPC服务。










