以下是我的原型服务:
service Greeter {
// Sends a greeting
rpc IntroduceYourName(HelloRequest) returns (google.protobuf.Empty);
rpc SayHellos (RepeatHelloRequest) returns (stream HelloReply);
}
// The request message containing the user's name.
message HelloRequest {
string name = 1;
}
message RepeatHelloRequest {
int32 count = 1;
}
// The response message containing the greetings.
message HelloReply {
string message = 1;
}
这是一项简单的服务,我试图在IntroduceYourName方法中设置Name属性,并在SayHellos方法中获取Name。
但是它不起作用,并且当客户端调用SayHellos方法时Name为null。
我正在研究Net Core 3.1。
服务器实现:
public override Task<Empty> IntroduceYourName(HelloRequest request, ServerCallContext context)
{
this.Name = request.Name;
_logger.LogInformation($"Name : {this.Name}");
return Task.FromResult(new Empty());
}
public override async Task SayHellos(RepeatHelloRequest request, IServerStreamWriter<HelloReply> responseStream, ServerCallContext context)
{
logger.LogInformation($"SayHellos Name : {this.Name}");
// _logger.LogInformation("SayRepeatHello called");
int i = 0;
while (!context.CancellationToken.IsCancellationRequested && i++ < request.Count)
{
var reply = new HelloReply
{
Message = DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss.fff tt") + $" Hello {i} " +this.Name
};
await responseStream.WriteAsync(reply);
await Task.Delay(1000);
}
if (context.CancellationToken.IsCancellationRequested)
{
_logger.LogInformation("The client cancelled their request");
}
}
客户代码:
using var channel = GrpcChannel.ForAddress("https://localhost:5001");
CancellationToken ct = new CancellationToken();
Greeter.GreeterClient client = new Greeter.GreeterClient(channel);
client.IntroduceYourName(new HelloRequest() { Name = "Foo" });
using var stream = client.SayHellos(new RepeatHelloRequest() { Count = 10 }, cancellationToken: ct);
while (await stream.ResponseStream.MoveNext(ct))
{
Console.WriteLine("Greeting: " + stream.ResponseStream.Current.Message);
}