C#中使用gRPC(二)

前面一章节
https://www.cnblogs.com/baiyunpiaopiao/p/18628502

这一节,我们实际操作和体验一下再C#中使用gPrc

我用的开发环境是VS2022和.Net6的版本。


创建好项目以后,ASP.NET Core会自动帮我们创建一个greet.proto的文件和一个服务
调整一下greet.proto文件,假设我们的sayHello方法传入一个对象,有年龄,姓名,住址和电话这四个字段,其中电话是一个字符串数组。方法返回一个json的HelloRequestUser对象。

  1. 修改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)
            }); 
        }

至此,服务端程序暂时告一段落

接下来我们看一下客户端程序

  1. 新建一个.NetCore控制台应用程序。
  2. 在项目中添加一个文件夹叫做Protos的文件夹。
  3. 将服务端中的Protos/greet.proto文件拷贝到客户端程序中
  4. 安装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;
}

然后再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 命令启动的。
然后再把客户端启动起来,如图

posted @ 2024-12-24 19:19  愤怒的小辣椒  阅读(40)  评论(0编辑  收藏  举报