.NET中使用gRPC通信需三步:定义一致的.proto协议文件、服务端注册Grpc并实现继承XXXBase的服务类、客户端用GrpcChannel创建强类型客户端调用;注意csharp_namespace匹配、HTTPS配置及.proto生成设置。

在.NET中使用gRPC通信,核心是定义协议(.proto文件)、生成客户端和服务端代码、启动服务并调用。整个流程不复杂但需注意几个关键点:协议必须严格一致、服务需正确注册、客户端需用强类型通道调用。
定义gRPC服务接口(.proto文件)
所有gRPC通信都从一个.proto文件开始。它声明服务方法、请求和响应消息结构,是服务端与客户端的唯一契约。
示例 greet.proto:
syntax = "proto3";
option csharp_namespace = "MyGrpcService";
package greet;
service Greeter {
rpc SayHello (HelloRequest) returns (HelloReply);
}
message HelloRequest {
string name = 1;
}
message HelloReply {
string message = 1;
}
⚠️ 注意:csharp_namespace 必须与项目命名空间匹配;package 影响生成的C#类嵌套路径。
创建.NET gRPC服务端
新建 ASP.NET Core gRPC 项目(或在现有Web项目中添加gRPC支持):
- 安装 Grpc.AspNetCore NuGet 包
- 在 Program.cs 中注册服务和中间件:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddGrpc(); // 启用gRPC支持
var app = builder.Build();
app.MapGrpcService<GreeterService>(); // 注册你的服务实现
app.MapGet("/", () => "Communication with gRPC endpoints.");
实现服务类 GreeterService.cs:
智能模型自动切换 V5.0.2 - 多模态感知,自动识别图片/视频/音频/代码/文本任务,切换最优模型。支持图片理解(qwen3-vl-plus)、视频音频(qwen3.5-plus)、代码(glm-5)、Office文档(MiniMax-M2.5)、推理等场景。零感知切换,无需手动操作。
public class GreeterService : Greeter.GreeterBase
{
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
return Task.FromResult(new HelloReply { Message = $"Hello, {request.Name}!" });
}
}
✅ 确保继承自 XXXBase(由.proto生成),且方法签名完全匹配。
从客户端调用gRPC服务
客户端可以是控制台、WPF、Blazor WASM(需额外配置)或另一个ASP.NET Core应用。
- 添加 Grpc.Net.Client 和 protobuf 相关包(如 Google.Protobuf、Grpc.Tools)
- 将服务端的 .proto 文件复制到客户端项目(或通过NuGet共享契约库)
- 设置 .csproj 中的
<Protobuf>项以生成客户端代码
调用示例(控制台程序):
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "Alice" });
Console.WriteLine(reply.Message); // 输出:Hello, Alice!
? 提示:开发时推荐用 https + Kestrel(默认启用TLS);若用HTTP明文,需显式配置 AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true) 并改用 http:// 地址。
常见问题与建议
调试gRPC时容易卡在几个地方:
-
404错误:检查服务是否注册了
MapGrpcService<>,URL路径是否含.proto中定义的服务名 -
SSL handshake failed:客户端地址用了
http://但服务跑在HTTPS上,或证书不受信任(开发可用channel = GrpcChannel.ForAddress(..., new GrpcChannelOptions { HttpHandler = new HttpClientHandler { ServerCertificateCustomValidationCallback = (a,b,c,d) => true } });) -
找不到类型:确认
.proto已设为<Protobuf Include="..." Link="..." GrpcServices="Client" />,且生成操作为Compile
基本上就这些。只要.proto一致、服务注册对、通道地址通,调用就能跑起来。

















