我正在尝试在我的 GRPC 服务上使用 Postman,如下所述:https://learn.microsoft.com/en-us/aspnet/core/grpc/test-tools?view=aspnetcore-6.0
不幸的是,我收到以下错误:
无法加载服务器反射。
详细信息:未知错误
在控制台中我可以看到一堆信息消息,没有错误:
信息:Microsoft.AspNetCore.Hosting.Diagnostics2 请求完成 HTTP/2 POST http://localhost:5001/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo 应用程序/grpc - - 200 - 应用程序/grpc 57.0449ms
信息:Microsoft.AspNetCore.Hosting.Diagnostics2 请求完成 HTTP/2 POST http://localhost:5001/grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo 应用程序/grpc - - 200 - 应用程序/grpc 158.2632ms
信息: Microsoft.AspNetCore.Routing.EndpointMiddleware1
执行端点“gRPC - /grpc.reflection.v1alpha.ServerReflection/ServerReflectionInfo”
不确定可以采取哪些措施来调查和修复。
如果我将原始文件导入 Postman,我可以执行端点并且它可以正常工作。
一些细节:
任何帮助表示赞赏!
我使用 https://github.com/fullstorydev/grpcurl 而不是 Postman 来连接到该服务。它立即给了我有意义的错误:
无法解析符号“My.Service”:
找不到符号:My.Service
原因:找不到文件:google/protobuf/Empty.proto
有点费解,尤其是服务还可以。
然而,事实证明我的导入定义的大小写不正确(请参阅https://github.com/fullstorydev/grpcurl/issues/203)。
我有
"google/protobuf/Empty.proto";
而不是 import "google/protobuf/empty.proto";
。
更正后,它在 Postman 和 Grpcurl 中都可以正常工作。
郑重声明 - Grpcurl 的错误处理能力并不比 Postman 更好。
这取决于 - 例如,当使用不正确的协议时(HTTP 1 而不是 HTTP 2),Grpcurl 只是说
Failed to dial target host "localhost:5001": context deadline exceeded
而 Postman 的错误更有意义:INTERNAL: Received RST_STREAM with code 2 triggered by internal client error: Protocol error
今天,我在项目中遇到了这个问题。我找到了解决方案。
您必须为 gRPC 启用服务器反射。
问题:
info: Grpc.AspNetCore.Server.Internal.ServerCallHandlerFactory[1]
Service 'grpc.reflection.v1alpha.ServerReflection' is unimplemented.
解决方案:
首先,安装
NuGet 包。这将包含我们需要的 ServerReflection 实现,它允许外部服务和工具发现现有方法Grpc.AspNetCore.Server.Reflection
其次,使用AddGrpcReflection扩展方法注册服务器反射:
builder.Services.AddGrpcReflection();
第三,使用MapGrpcReflectionService扩展方法注册服务器反射中间件:
app.MapGrpcReflectionService();
了解更多信息,您可以访问此链接:启用 gRPC 服务器反射