延續前面的 Stream,這邊介紹 gRPC 裡面的 Client Stream
.proto
檔內容如下,延續前一篇的繼續在裡面新增,改成在 Request 那邊新增 stream
service StreamdemoService {
//...
rpc HelloClientStream (stream StreamRequest) returns (StreamReply);
}
StreamDemoService.cs
實作這個方法
//...
public override async Task<StreamReply> HelloClientStream(IAsyncStreamReader<StreamRequest> requestStream, ServerCallContext context)
{
await foreach (var item in requestStream.ReadAllAsync())
{
// Do something
}
// or
while (await requestStream.MoveNext())
{
var currentItem = requestStream.Current;
// Do something
}
return new StreamReply() { Message = "HelloWithClientCount Done" };
}
Program.cs
內新增
// 一樣需要有 channel 跟 client
GrpcChannel channel = GrpcChannel.ForAddress("https://localhost:7204");
var client = new StreamdemoService.StreamdemoServiceClient(channel);
// 宣告使用 client stream
using var clientStream = client.HelloClientStream();
for (var i = 0; i < 3; i++)
{
// 要傳到 server 的資訊
await clientStream.RequestStream.WriteAsync(new StreamRequest() { Name = "Client Stream Demo", Count = i });
}
// 傳送結束呼叫
await clientStream.RequestStream.CompleteAsync();
// 取得結果
var response = await clientStream // or clientStream.ResponseAsync;
以上