ASP.net Core gRPC - остановить обработку запроса по таймауту

Есть некий микросервис общающийся по gRPC, в нем бывает суперредкое событие когда код зацикливается, выловить пока не получается но хочется обработать такое поведение - хочется чтобы код (поток?) обрывался по таймауту и в ответ на запрос отстрелить какую-то ошибку. Есть какие-то штатные приемы? Чет загуглить не получилось - а ранее с такими проблемами не сталкивался.


Ответы (1 шт):

Автор решения: Vasek

У каждого запроса есть параметр deadline и cancellationToken. Через них можно делать таймауты.

try {
    var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" }, deadline: DateTime.UtcNow.AddSeconds(5));
    Console.WriteLine("Greeting deadline: " + reply.Message);
}
catch (RpcException e) when (e.StatusCode == StatusCode.DeadlineExceeded) {
    // nop
}

try {
    var cts = new CancellationTokenSource(TimeSpan.FromSeconds(5));
    var reply = await client.SayHelloAsync(new HelloRequest { Name = "GreeterClient" }, cancellationToken: cts.Token);
    Console.WriteLine("Greeting cts: " + reply.Message);
}
catch (RpcException e) when (e.StatusCode == StatusCode.Cancelled) {
    // nop
}

На сервере так же можно получить что клиент послал отмену

public override async Task<HelloReply> SayHello(HelloRequest request, ServerCallContext context)
{
    try {
        await Task.Delay(20_000, context.CancellationToken);
    }
    catch (OperationCanceledException) {
        Console.WriteLine("cancel");
    }

    return new HelloReply() {
        Message = "Hello " + request.Name
    };
}
→ Ссылка