.Net Core框架下 Grpc四种处理方法

1、在.Net Core框架下 实现Grpc客户端和服务端的四种处理方法,包括:

一元方法
服务器流式处理方法
客户端流式处理方法
双向流式处理方法

2、沿用上一篇的服务端,修改GreeterService.cs文件

 public class GreeterService : TestGrpc.TestGrpcBase
    {
        private readonly ILogger<GreeterService> _logger;
        public GreeterService(ILogger<GreeterService> logger)
        {
            _logger = logger;
        }

        public override Task<TestReply> TestSay(TestRequest request, ServerCallContext context)
        {
            Console.WriteLine($"接收到{request.Name}的消息");
            return Task.FromResult(new TestReply
            {
                Message = "Hello " + request.Name
            });
        }

        public override async Task StreamingFromServer(ExampleRequest request, IServerStreamWriter<ExampleResponse> responseStream, ServerCallContext context)
        {
            Console.WriteLine("服务器流开始响应。。。。");
            for (int i = 0; i < 5; i++)
            {
                await responseStream.WriteAsync(new ExampleResponse()
                {
                    Name="qq",
                    Sex="woman"
                });
                await Task.Delay(TimeSpan.FromSeconds(1));
            }
            Console.WriteLine("服务器流结束响应。。。。");
        }

        public override Task<ExampleResponse> StreamingFromClient(IAsyncStreamReader<ExampleRequest> requestStream, ServerCallContext context)
        {
            Console.WriteLine("服务器开始响应客户端流。。。。");
            return Task.FromResult(new ExampleResponse
            {
                Name = "客户端流"
            });
        }

        public override async Task StreamingBothWays(IAsyncStreamReader<ExampleRequest> requestStream, IServerStreamWriter<ExampleResponse> responseStream, ServerCallContext context)
        {
            Console.WriteLine("双向流开始响应。。。。");
            await foreach (var message in requestStream.ReadAllAsync())
            {
                await responseStream.WriteAsync(new ExampleResponse()
                {
                    Name="双向流"
                });
            }
            Console.WriteLine("双向流结束响应。。。。");
        }
    }

3、修改greet.proto文件

syntax = "proto3";

option csharp_namespace = "MyGrpcServer";

package MyGrpc;

// The greeting service definition.
service TestGrpc {
  // Sends a greeting
  rpc TestSay (TestRequest) returns (TestReply);

  rpc StreamingFromServer(ExampleRequest) returns (stream ExampleResponse);

  rpc StreamingFromClient(stream ExampleRequest) returns (ExampleResponse);

  rpc StreamingBothWays(stream ExampleRequest) returns (stream ExampleResponse);

}

// The request message containing the user's name.
message TestRequest {
  string name = 1;
}

// The response message containing the greetings.
message TestReply {
  string message = 1;
}

message ExampleRequest{
int32 pageIndex=1;
int32 pageSize=2;
bool isDescending=3;
}

message ExampleResponse{
string name=1;
string sex=2;
}

4、沿用上一篇的客户端,修改Program.cs

 class Program
    {
        static async Task Main(string[] args)
        {
            using var channel = GrpcChannel.ForAddress("http://localhost:5000");
            var client = new TestGrpc.TestGrpcClient(channel);
            #region 一元方法
            var ret = await client.TestSayAsync(new TestRequest { Name = "MyTestClient" });
            Console.WriteLine("MyTestGrpc: " + ret.Message);
            #endregion

            #region 服务器流
            using var call = client.StreamingFromServer(new ExampleRequest { PageIndex = 1,PageSize=3,IsDescending=true });

            while (await call.ResponseStream.MoveNext())
            {
                Console.WriteLine("服务器流: " + call.ResponseStream.Current.Name);
                // "Greeting: Hello World" is written multiple times
            }
            #endregion

            #region 客户端流

            using var clientStream = client.StreamingFromClient();

            for (var i = 0; i < 5; i++)
            {
                Console.WriteLine("客户端流"+i);
             
                await clientStream.RequestStream.WriteAsync(new ExampleRequest { PageIndex = 1, PageSize = 3, IsDescending = true });

            }
            await clientStream.RequestStream.CompleteAsync();

            var response = await clientStream;
            Console.WriteLine($"客户端流: {response.Name}");

            #endregion

            #region 双向流

            using var bothStream = client.StreamingBothWays();

            for (var i = 0; i < 100; i++)
            {
                Console.WriteLine("双向流" + i);

                await bothStream.RequestStream.WriteAsync(new ExampleRequest { PageIndex = 1, PageSize = 3, IsDescending = true });

            }
            await bothStream.RequestStream.CompleteAsync();
            while (await bothStream.ResponseStream.MoveNext())
            {
                Console.WriteLine("双向流: " + bothStream.ResponseStream.Current.Name);
                // "Greeting: Hello World" is written multiple times
            }

            

            #endregion

            Console.WriteLine("Press any key to exit...");
            Console.ReadKey();
        }
    }

5、修改greet.proto文件

syntax = "proto3";

option csharp_namespace = "MyGrpcClient";

package MyGrpc;

// The greeting service definition.
service TestGrpc {
  // Sends a greeting
  rpc TestSay (TestRequest) returns (TestReply);

  rpc StreamingFromServer(ExampleRequest) returns (stream ExampleResponse);

  rpc StreamingFromClient(stream ExampleRequest) returns (ExampleResponse);

  rpc StreamingBothWays(stream ExampleRequest) returns (stream ExampleResponse);
}

// The request message containing the user's name.
message TestRequest {
  string name = 1;
}

// The response message containing the greetings.
message TestReply {
  string message = 1;
}

message ExampleRequest{
int32 pageIndex=1;
int32 pageSize=2;
bool isDescending=3;
}

message ExampleResponse{
string name=1;
string sex=2;
}
原文地址:https://www.cnblogs.com/lhwpc/p/15160792.html