gpt4 book ai didi

c# - 如何让grpc像WCF一样抛出原始异常?

转载 作者:行者123 更新时间:2023-12-03 16:48:30 34 4
gpt4 key购买 nike

我想知道是否有办法让 Grpc .Net Core 将服务器端的原始异常抛回客户端。
问题如下。调用grpc服务时,例如:
客户:

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.")'
那更好,但仍然不完美。
我的问题是 - 我可以以某种方式在客户端引发服务器异常吗?我读到的事实是,grpc 允许“拦截器”拦截 grpc 调用。这是有可能在这里做点什么吗?

最佳答案

您可以设置一个 Interceptor捕获服务器端异常,序列化异常元数据,并将其打包成自定义 RpcException .客户端可以反序列化来自 RpcException 的元数据。并重新创建异常。
这是我发现的一篇博客文章,它逐步完成了这个过程:ASP gRPC Custom Error Handling
正如您可以想象的那样,缺点是每个异常都需要这样做。
我也一直在研究同样的问题,但还没有找到任何直接的方法将其应用于所有异常。
配置拦截器:

services.AddGrpc(options => 
{
options.Interceptors.Add<GRPCInterceptor>();
});
裸机拦截器:
public class GRPCInterceptor : Interceptor
{
private readonly ILogger logger;

public GRPCInterceptor(ILogger logger)
{
this.logger = logger;
}

public override async Task<TResponse> UnaryServerHandler<TRequest, TResponse>(TRequest request, ServerCallContext context, UnaryServerMethod<TRequest, TResponse> continuation)
{
logger.Debug($"starting call");

var response = await base.UnaryServerHandler(request, context, continuation);

logger.Debug($"finished call");

return response;
}
}

关于c# - 如何让grpc像WCF一样抛出原始异常?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62823340/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com