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;
}