新闻中心

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服务创建与调用方法的详细内容,更多请关注其它相关文章!


# app  # go  # web项目  # c#类  # .net  # c#  # 常见问题  # google  # switch  # ai  # ssl  # 交通运输网站优化维护  # 县级新闻网站建设  # 目标网站seo测评报告  # 杭州seo营销平台  # 一封  # 兰州全屋定制抖音推广营销  # 神马影视网站建设  # 找不到  # 就能  # 有哪些  # 电子邮件  # 操作指南  # 如何使用  # 几个  # 服务端  # 客户端  # seo网站优化案列  # 揭阳媒体营销推广  # 深圳网奇seo优化  # 营销羊肉推广方案范文 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 192.168.1.1管理中心入口 192.168.1.1路由器网页设置平台  响应式CSS Grid布局:优化网格项在小屏幕下的堆叠与宽度适配  C++如何打印当前代码行号与文件名_C++预定义宏FILE与LINE的使用  Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】  机构:以往存储涨价周期小米利润率实际上有所改善 能转嫁给消费者等  J*a TimerTask中HashMap意外清空的深层原因与解决方案  CSS条件样式无法按设备触发怎么排查_media条件语句正确设置解决触发问题  React Router v6 教程:构建认证保护的私有路由与重定向策略  Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南  msn官网入口地址手机版 msn官方网站手机最新链接  支付宝如何设置安全保护_支付宝安全设置的全面教程  C++ explicit关键字防止隐式转换_C++构造函数安全规范  虚幻5科幻题材ARPG大作遭取消!本是《奇异人生》厂商新作  Golang指针如何与map组合使用_Golang map指针组合实践  Node.js中HTML按钮与J*aScript函数交互的正确姿势  Golang如何处理RPC请求负载均衡_Golang RPC请求负载均衡策略与实践  Fabric Mod开发:在1.19.3+版本中正确添加自定义物品并管理物品组  Angular Material 垂直步进器:实现底部到顶部排序的教程  提升屏幕阅读器对“m”时间单位的播报准确性:HTML与CSS组合解决方案  windows10怎么查看本机ip_windows10命令提示符ipconfig使用  在J*a中如何开发简易仓库管理与库存统计_仓库管理库存统计项目实战解析  如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单  Django通过AJAX异步上传图片并保存至模型的完整指南  漫画星球免费下拉式入口 漫画星球免费漫画在线阅读网站  天猫2025双十一0点秒杀攻略 天猫爆款抢购时间  126邮箱账号注册 电脑版登录入口  php源码怎么在电脑上测试_电脑测试php源码方法步骤【教程】  深入理解rpy2中的类型转换:优化Python对象到R矩阵的映射  必由学网页版入口 必由学官方平台直接访问  HuggingFaceEmbeddings中向量嵌入维度调整的限制与理解  PyTorch模型训练效果不佳?深入剖析常见错误与调试技巧  漫蛙manwa2最新登录网址_漫蛙manwa2手机网页版入口  J*a中实现Go语言select通道多路复用机制  iCloud登录入口网页版 苹果iCloud官网登录  必由学登录入口 必由学官方网站在线访问链接  Excel组合图表怎么做 Excel创建柱状图与折线组合图教程【图表】  怎么去除衣服上的口红印_生活小妙招教你用酒精轻松擦除  抖音从哪里进入网页版_抖音官方入口链接  Kafka Streams中基于消息头条件过滤消息的实现指南  MongoDB Aggregation:在嵌套对象数组中精确匹配ObjectId  天猫双十一预售商品怎么退款_天猫双十一预售退款操作指南  c++如何使用折叠表达式(Fold Expressions)_c++17可变参数模板新技巧  荣耀Play7T运行卡顿解决_荣耀Play7T性能优化  优化Log4j2控制台输出性能:解决异步日志瓶颈  在J*aScript中复现SciPy的B样条拟合与求值:关键考量  J*aScript中向JSON对象添加新属性的正确姿势  Typer应用中灵活处理命令行参数的令牌化与解析  SteamMachine定价或为699美元 大家想入手吗?  Python多版本共存与虚拟环境管理深度指南  如何优雅地扩展SprykerGlue后端API授权逻辑,使用spryker/glue-backend-api-application-authorization-connector-extension 

搜索