如何配置gRPC并在Postman中测试HealthCheck?
提问:Postman调用gRPC HealthCheck服务报错
我刚接触gRPC,正在研究HealthCheck机制来确保服务器正常运行并能接收请求。已经在服务器的Program.cs中添加了以下配置:
services.AddGrpc(); services.AddGrpcHealthChecks().AddCheck("Check", () => HealthCheckResult.Healthy()); services.Configure<HealthCheckPublisherOptions>(options => options.Delay = TimeSpan.Zero);
应用构建器中添加了如下代码:
app.UseRouting(); app.UseGrpcWeb(new GrpcWebOptions { DefaultEnabled = true }); app.UseEndpoints(endpoints => { endpoints.MapGrpcHealthChecksService(); endpoints.MapGet("/", () => "Some text"); });
我认为这样已经配置好可调用的默认HealthCheck服务,也清楚gRPC客户端的调用方式,但不知道怎么在Postman里调用——gRPC请求需要protobuf文件(我之前没有)、启用服务器反射(没开)或者创建并使用protobuf API。
更新
我按照官方健康检查规范创建了符合要求的proto文件,其中引用的grpc.health.v1.health/Check和应用构建器中的配置匹配,但在Postman调用时出现错误:
收到由客户端内部错误触发的RST_STREAM,错误码2:协议错误
解决建议
1. 核对Postman的gRPC请求配置
- 切换请求类型为gRPC,不要用HTTP/REST模式
- 填写正确的服务器地址(例如
http://localhost:5000),HTTPS环境要对应调整地址前缀 - 在「Service definition」中上传正确的健康检查proto文件,标准内容如下:
syntax = "proto3"; package grpc.health.v1; message HealthCheckRequest { string service = 1; } message HealthCheckResponse { enum ServingStatus { UNKNOWN = 0; SERVING = 1; NOT_SERVING = 2; SERVICE_UNKNOWN = 3; } ServingStatus status = 1; } service Health { rpc Check(HealthCheckRequest) returns (HealthCheckResponse); rpc Watch(HealthCheckRequest) returns (stream HealthCheckResponse); }
2. 适配gRPC Web配置
你启用了GrpcWeb,但Postman默认gRPC调用用的是HTTP/2纯gRPC协议,和GrpcWeb(基于HTTP/1.1)不兼容,二选一调整:
- 在Postman请求的「Advanced」设置里开启gRPC Web选项
- 暂时移除服务器端的
UseGrpcWeb配置,用纯HTTP/2协议测试服务可用性
3. 确保服务器支持HTTP/2
如果用Kestrel服务器,需显式配置HTTP/2支持:
var builder = WebApplication.CreateBuilder(args); builder.WebHost.ConfigureKestrel(options => { options.ListenAnyIP(5000, o => o.Protocols = HttpProtocols.Http2); });
4. 检查请求参数正确性
调用Check方法时,service参数可传空字符串(检查整个服务器状态)或你配置的"Check"服务名,不要留空或传错误名称
内容的提问来源于stack exchange,提问作者sr28
相关产品推荐
相关产品推荐

