0

0

C# gRPC服务创建方法 C#如何创建和调用gRPC服务

幻夢星雲

幻夢星雲

发布时间:2026-02-17 01:23:17

|

594人浏览过

|

来源于php中文网

原创

用 dotnet new grpc 创建项目是最直接起点,生成含 greeterservice 的完整 grpc 服务,需注意 https/http/2 配置、.proto 文件位置与生成操作、服务注册 app.mapgrpcservice()、客户端必须通过 grpcchannel 调用、正确处理 statuscode=unavailable(连接问题)与 internal(服务端异常)。

c# grpc服务创建方法 c#如何创建和调用grpc服务

dotnet new grpc 创建基础服务项目

这是最直接的起点,命令会生成包含 GreeterService 示例的完整可运行 gRPC 服务(基于 ASP.NET Core)。

执行后你会得到一个带 Program.csProtos/greet.protoServices/GreeterService.cs 的项目。关键点在于:它默认启用 HTTPS 和 HTTP/2,且 app.MapGrpcService<greeterservice>()</greeterservice> 是注册服务的必需调用。

  • 若在非开发环境部署,需确保服务器支持 HTTP/2(如 Kestrel 默认支持,IIS 需 Windows Server 2016+ + TLS 1.2+)
  • .proto 文件必须放在 Protos/ 目录并设为 Protobuf 生成操作,否则 dotnet build 不会生成 C# 绑定类
  • 不要手动修改生成的 *.Grpc.cs 文件——它们每次构建都会被覆盖

定义接口时注意 servicerpc 的写法

gRPC 的契约由 .proto 文件驱动,C# 类型和行为完全由此决定。错误的 proto 定义会导致客户端和服务端无法通信,甚至编译不报错但运行时报 StatusCode=Unimplemented

常见问题包括:

千博购物系统.Net
千博购物系统.Net

千博购物系统.Net能够适合不同类型商品,为您提供了一个完整的在线开店解决方案。千博购物系统.Net除了拥有一般网上商店系统所具有的所有功能,还拥有着其它网店系统没有的许多超强功能。千博购物系统.Net适合中小企业和个人快速构建个性化的网上商店。强劲、安全、稳定、易用、免费是它的主要特性。系统由C#及Access/MS SQL开发,是B/S(浏览器/服务器)结构Asp.Net程序。多种独创的技术使

下载
  • 遗漏 option csharp_namespace = "MyApp.Protos"; —— 导致生成的 C# 类不在预期命名空间,引用失败
  • rpc SayHello(HelloRequest) returns (HelloReply); 中的 HelloRequestHelloReply 必须已用 message 正确定义,且字段名首字母小写(如 string name = 1; → C# 属性为 Name
  • 流式方法要显式标注:比如 rpc StreamingCall(stream ClientMessage) returns (stream ServerMessage);,否则生成器不会产生 IAsyncStreamReaderIServerStreamWriter

客户端调用必须用 Channel + 生成的 *Client

不能像调用普通类一样 new 一个服务类;必须通过 GrpcChannel.ForAddress("https://localhost:5001") 创建通道,再传给生成的客户端构造函数。

典型调用模式:

using var channel = GrpcChannel.ForAddress("https://localhost:5001");
var client = new Greeter.GreeterClient(channel);
var reply = await client.SayHelloAsync(new HelloRequest { Name = "Alice" });
  • HTTP/2 要求地址协议明确:用 https://(开发时可配 http://,但需在 channel 构造时加 new GrpcChannelOptions { HttpHandler = new SocketsHttpHandler { EnableMultipleHttp2Connections = true } }
  • 若服务启用了 TLS 但客户端证书验证失败,会抛 System.Net.Http.HttpRequestException,提示 “The SSL connection could not be established” —— 此时需配置 GrpcChannelOptions.Credentials 或临时禁用验证(仅限开发)
  • 短生命周期调用建议复用 GrpcChannel 实例(它是线程安全的),不要为每次请求新建 channel

调试时先确认 StatusCode=Internal 还是 StatusCode=Unavailable

这两个错误看起来像网络问题,但根源完全不同:

  • StatusCode=Unavailable:通常是连接失败(地址错、端口未监听、防火墙拦截、TLS 协商失败),检查 dotnet run 是否真在监听,用 curl -v https://localhost:5001 看是否返回 HTTP/2 404(说明服务起来了)
  • StatusCode=Internal:大概率是服务端代码异常未捕获,比如 SayHello 方法里 throw 了未处理的 Exception —— gRPC 会将其转为 Internal 并丢掉原始堆栈;应在服务端添加全局异常过滤器或日志中间件捕获
  • 客户端收到异常时,exception.Status.Detail 可能含服务端返回的错误信息(前提是服务端用了 Status(StatusCode.Internal, "xxx") 显式设置)

proto 文件改了之后,务必重新生成客户端和服务端代码;Visual Studio 不总会自动触发,可手动运行 dotnet build 或右键 .proto 文件选 “重新生成”。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
什么是中间件
什么是中间件

中间件是一种软件组件,充当不兼容组件之间的桥梁,提供额外服务,例如集成异构系统、提供常用服务、提高应用程序性能,以及简化应用程序开发。想了解更多中间件的相关内容,可以阅读本专题下面的文章。

180

2024.05.11

Golang 中间件开发与微服务架构
Golang 中间件开发与微服务架构

本专题系统讲解 Golang 在微服务架构中的中间件开发,包括日志处理、限流与熔断、认证与授权、服务监控、API 网关设计等常见中间件功能的实现。通过实战项目,帮助开发者理解如何使用 Go 编写高效、可扩展的中间件组件,并在微服务环境中进行灵活部署与管理。

222

2025.12.18

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

750

2023.08.02

curl_exec
curl_exec

curl_exec函数是PHP cURL函数列表中的一种,它的功能是执行一个cURL会话。给大家总结了一下php curl_exec函数的一些用法实例,这个函数应该在初始化一个cURL会话并且全部的选项都被设置后被调用。他的返回值成功时返回TRUE, 或者在失败时返回FALSE。

452

2023.06.14

linux常见下载安装工具
linux常见下载安装工具

linux常见下载安装工具有APT、YUM、DNF、Snapcraft、Flatpak、AppImage、Wget、Curl等。想了解更多linux常见下载安装工具相关内容,可以阅读本专题下面的文章。

181

2023.10.30

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1486

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

383

2025.10.17

php8.4实现接口限流的教程
php8.4实现接口限流的教程

PHP8.4本身不内置限流功能,需借助Redis(令牌桶)或Swoole(漏桶)实现;文件锁因I/O瓶颈、无跨机共享、秒级精度等缺陷不适用高并发场景。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2224

2025.12.29

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

283

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.5万人学习

C 教程
C 教程

共75课时 | 4.7万人学习

C++教程
C++教程

共115课时 | 17.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号