为什么gRPC无法在服务方法调用之间保持状态?

时间:2020-06-04 06:57:17

标签: c# grpc core

以下是我的原型服务:

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

0 个答案:

没有答案