这一节,我们实际操作和体验一下再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文件拷贝到客户端程序中
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 ;
}
项目结构如下:
接下来修改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 命令启动的。
然后再把客户端启动起来,如图