Мне было интересно, есть ли способ, чтобы Grp c. Net Core возвращал клиенту исходное исключение на стороне сервера.
Проблема в следующем. При вызове службы grp c, например:
Клиент:
using (var channel = GrpcChannel.ForAddress("http://localhost:10042"))
{
var greeterService = channel.CreateGrpcService<IGreetService>();
var result = await greeterService.Greet();
Console.WriteLine(result.Greet);
}
Сервер:
public async Task<Greeting> Greet()
{
throw new ArgumentException();
}
Запускается следующее исключение RpcException:
Grpc.Core.RpcException: 'Status(StatusCode=Unknown, Detail="Exception was thrown by handler.")'
Теперь мне бы очень хотелось, чтобы это привело к фактическому возникновению исключения ArgumentException на стороне клиента, чтобы с этим можно было справиться лучше.
Что возможно, поэтому я решил , заключается в том, чтобы сделать следующее в моем Startup.cs:
services.AddCodeFirstGrpc(options => options.EnableDetailedErrors = true);
Результат:
Grpc.Core.RpcException: 'Status(StatusCode=Unknown, Detail="Exception was thrown by handler. ArgumentException: Value does not fall within the expected range.")'
Это лучше, но все же не идеально.
Мой вопрос - Могу ли я как-то поднять исключение серверов на стороне клиента? Я прочитал кое-что о том, что grp c позволяет «Перехватчикам» перехватывать вызовы grp c. Есть ли возможность здесь что-то сделать?