C#中使用gRPC(二)
前面一章节
https://www.cnblogs.com/baiyunpiaopiao/p/18628502
这一节,我们实际操作和体验一下再C#中使用gPrc
我用的开发环境是VS2022和.Net6的版本。
创建好项目以后,ASP.NET Core会自动帮我们创建一个greet.proto的文件和一个服务
调整一下greet.proto文件,假设我们的sayHello方法传入一个对象,有年龄,姓名,住址和电话这四个字段,其中电话是一个字符串数组。方法返回一个json的HelloRequestUser对象。
- 修改proto文件
syntax = "proto3";
option csharp_namespace = "GrpcService";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
HelloRequestUser user = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
message HelloRequestUser{
string name = 1;
int32 age = 2;
string address = 3;
repeated string phones = 4;
}
2.修改Services/GreeterService.cs文件中的 SayHello方法。
public override Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
//return Task.FromResult(new HelloReply
//{
// Message = "Hello " + request.Name
//});
return Task.FromResult(new HelloReply
{
Message = "Hello " + JsonSerializer.Serialize(request.User)
});
}
至此,服务端程序暂时告一段落
接下来我们看一下客户端程序
- 新建一个.NetCore控制台应用程序。
- 在项目中添加一个文件夹叫做Protos的文件夹。
- 将服务端中的Protos/greet.proto文件拷贝到客户端程序中
- 安装Grpc.Net.Client、 Google.Protobuf、 Grpc.Tools 包
syntax = "proto3";
option csharp_namespace = "gRPCDemo.demo";// 这里修改成你自己的命名空间。例如我的应用程序叫gRPCDemo。给他的命名空间叫gRPCDemo.demo
import "Protos/userPackage.proto";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
requestUser.UserItem user = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
syntax = "proto3";
option csharp_namespace = "gRPCDemo.demo";// 这里修改成你自己的命名空间。例如我的应用程序叫gRPCDemo。给他的命名空间叫gRPCDemo.demo
import "Protos/userPackage.proto";
package greet;
// The greeting service definition.
service Greeter {
// Sends a greeting
rpc SayHello (HelloRequest) returns (HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
requestUser.UserItem user = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
然后再Protos文件夹中新建一个userPackage.proto的文件 代码如下
syntax = "proto3";
option csharp_namespace = "gRPCDemo.demo";
package requestUser;
message UserItem{
string name = 1;
int32 age = 2;
string address = 3;
repeated string phones = 4 ;
}
项目结构如下:
接下来 右键单击项目,并选择“编辑项目文件”。
<ItemGroup>
<Protobuf Include="Protos\greet.proto" GrpcServices="Client" />
</ItemGroup>
这里一定要改成Client
接下来修改main方法
internal class Program
{
async static Task Main(string[] args)
{
using var channel = GrpcChannel.ForAddress("http://localhost:5234"); // 这里你要查看你的grpc服务端的端口号。我这里是5234
var client = new Greeter.GreeterClient(channel);
var request = new HelloRequest
{
User = new UserItem() { Age = 23, Address = "bj", Name = "jane", }
};
request.User.Phones.Add("138 6666 6666");
request.User.Phones.Add("138 9999 9999");
var reply = await client.SayHelloAsync(request);
Console.WriteLine("服务器返回: " + reply.Message);
Console.WriteLine("Press any key to exit...");
Console.ReadKey();
}
}
接下来就可以调试啦。先把你的服务端启动。我是通过 dotnet run 命令启动的。
然后再把客户端启动起来,如图
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· .NET10 - 预览版1新功能体验(一)