如何使用C# gRPC客户端调用BentoML服务并生成对应Proto文件?
使用C# gRPC客户端调用BentoML服务的方法
1. 可行性说明
完全可以用C# gRPC客户端调用BentoML服务,BentoML默认会为你的服务自动生成gRPC接口及对应的Proto定义,无需手动编写。
2. 获取服务对应的Proto文件
BentoML启动服务后自带gRPC反射功能,你可以通过以下方式导出Proto文件:
- 先启动你的BentoML服务:运行
bentoml serve iris_classifier:latest(假设你的服务标签为该值),默认会在3000端口同时提供HTTP和gRPC服务。 - 用
grpcurl工具导出Proto:执行以下命令(需先安装grpcurl):
如果服务使用了单独的gRPC端口,替换成对应端口号即可。grpcurl -plaintext localhost:3000 describe > iris_classifier.proto - 另一种方式:访问服务的Swagger页面(默认地址
http://localhost:3000/swagger),在gRPC相关区域能找到完整的Proto定义,直接复制保存即可。
3. 生成C# gRPC客户端代码
拿到Proto文件后,用gRPC工具生成C#代码:
- 给你的C#项目安装两个NuGet包:
Grpc.Tools和Google.Protobuf - 将
iris_classifier.proto添加到项目中,右键文件设置属性:- 生成操作选择
Protobuf compiler - 输出选择
gRPC Stub Classes
- 生成操作选择
- 也可以用命令行生成(需指定gRPC C#插件路径):
protoc --csharp_out=. --grpc_out=. --plugin=protoc-gen-grpc=<你的grpc_csharp_plugin路径> iris_classifier.proto
4. C#客户端调用示例
生成代码后,参考以下代码调用服务:
using Grpc.Core; // 替换为Proto文件生成的实际命名空间 using IrisClassifierNamespace; var channel = new Channel("localhost:3000", ChannelCredentials.Insecure); var client = new IrisClassifier.IrisClassifierClient(channel); // 构造符合要求的输入数据,对应NumpyNdarray类型 var inputArray = new NumpyNdarray { Dtype = "float64", Shape = { 1, 4 }, // 1条样本,4个特征,和你的模型输入匹配 Data = Google.Protobuf.ByteString.CopyFrom( System.BitConverter.GetBytes(5.1) .Concat(System.BitConverter.GetBytes(3.5)) .Concat(System.BitConverter.GetBytes(1.4)) .Concat(System.BitConverter.GetBytes(0.2)) .ToArray() ) }; var request = new ClassifyRequest { Input = inputArray }; var response = client.Classify(request); // 解析输出结果 var outputBytes = response.Output.Data.ToByteArray(); var result = new double[response.Output.Shape[0]]; for (int i = 0; i < result.Length; i++) { result[i] = System.BitConverter.ToDouble(outputBytes, i * 8); } Console.WriteLine($"分类结果:{string.Join(", ", result)}"); channel.ShutdownAsync().Wait();
内容的提问来源于stack exchange,提问作者Youngwook Jun
相关产品推荐
相关产品推荐

