信息发布→ 登录 注册 退出

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

发布时间:2025-12-15

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

c#如何使用grpc通信 .net grpc服务创建与调用方法

在.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

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生成),且方法签名完全匹配。

Blackink AI纹身生成 Blackink AI纹身生成

创建类似纹身的设计,生成独特纹身

Blackink AI纹身生成 80 查看详情 Blackink AI纹身生成

从客户端调用gRPC服务

客户端可以是控制台、WPF、Blazor WASM(需额外配置)或另一个ASP.NET Core应用。

  • 添加 Grpc.Net.Clientprotobuf 相关包(如 Google.ProtobufGrpc.Tools
  • 将服务端的 .proto 文件复制到客户端项目(或通过NuGet共享契约库)
  • 设置 .csproj 中的 <protobuf></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"></protobuf>,且生成操作为 Compile

基本上就这些。只要.proto一致、服务注册对、通道地址通,调用就能跑起来。

以上就是C#如何使用gRPC通信 .NET gRPC服务创建与调用方法的详细内容,更多请关注其它相关文章!


相关文章: 如何将HTML表格多行数据保存到Google Sheet  Google翻译怎么语音输入_Google翻译语音输入功能使用与设置方法  深入理解J*a编译器的兼容性选项:从-source到--release  快手网页版在线登录 快手网页版官网入口快速访问  微信网页版登录教程_微信网页版登录入口在哪  今日头条怎么同步内容到抖音_今日头条内容同步到抖音教程  手机屏幕碎了但能正常使用怎么办 手机外屏碎裂的修复建议  抖音从哪里进入网页版_抖音官方入口链接  Windows10怎么开启夜间模式 Windows10系统设置调整色温与亮度缓解夜间用眼疲劳【教程】  在命令行怎么运行html项目_命令行运行html项目方法【教程】  Angular Material 垂直步进器:实现底部到顶部排序的教程  LocoySpider如何部署到云服务器_LocoySpider云部署的远程配置  俄罗斯方块最新版入口 俄罗斯方块在线玩官网入口  AO3镜像入口大全 AO3网页版内容访问全集  Go与Ruby之间实现AES加密互通:CFB模式下的密钥长度匹配策略  如何将一个大型PHP应用拆分为多个Composer包_微服务与模块化架构的Composer实践  小红书怎么解除第三方平台绑定_小红书多平台登录解绑方法介绍  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  邮政编码查询不到怎么办_邮政编码查询不到的常见原因与对策  4399免费游戏网址入口 4399小游戏免费入口点开即玩  ArrayList与LinkedList核心操作的Big-O复杂度分析  Win11如何开启讲述人功能 Win11屏幕阅读器(讲述人)开启与关闭【教程】  初次安装JDK时环境变量如何正确配置_J*A_HOME与PATH设置规则讲解  QQ邮箱网页版邮箱入口 QQ邮箱官方登录平台  中兴Axon42Ultra怎样在文件App筛图_iPhone中兴Axon42Ultra文件App筛图【图片筛选】  Win11怎么隐藏桌面图标 Win11一键隐藏所有桌面元素及恢复显示  微博网页版官方账号登录 微博网页版内容浏览使用指南  苹果手机指南针不准怎么校准 传感器校准方法详解【建议收藏】  React/Next.js中实现列表项的动态选择与移动  使用PHP DOM解析器高效提取HTML中特定标题及其紧邻段落  Highcharts 雷达图径向轴标签定制指南:利用多Y轴实现数值标注  Django表单提交验证失败后保持字段值不刷新  微信聊天记录怎么加密_微信聊天记录加密方法  J*a递归快速排序中静态变量的状态管理与陷阱  Angular中单选按钮的正确使用与常见陷阱解析  抖音网页版快捷访问 抖音网页版网页版入口操作教程  12306几点到几点不能订票? | 官方最新系统维护时间全解析  CSS图片焦点样式实现教程:理解与应用tabindex属性  LINUX的perf命令入门_LINUX官方性能分析工具的使用与解读  《明末:渊虚之羽》设计师谈设计角色:那会刚毕业 充满激情  Odoo 16:在表单视图中基于当前记录动态修改Tree视图属性  J*aScript中赋值与自增运算符的复杂交互与执行机制  HTML5原生日期选择器与jQuery UI:实现日期选择器的联动与程序化控制  mcjs网页版流畅运行 mcjs低配电脑畅玩入口  c++如何使用chrono库处理时间_c++标准库时间与日期操作  大象笔记网页版入口 印象笔记网页版登录入口  Adobe PDF表单中利用J*aScript解析与格式化日期组件的教程  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  限制HTML日期输入框的日期选择范围  C++的std::forward_list怎么用_C++ STL中单向链表容器的特点与应用 

在线客服
服务热线

服务热线

4008988990

微信咨询
二维码
返回顶部
×二维码

截屏,微信识别二维码

打开微信

微信号已复制,请打开微信添加咨询详情!