微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当gRPC客户端在方法上抛出RpcException时,如何获取内部错误的innerException

如何解决当gRPC客户端在方法上抛出RpcException时,如何获取内部错误的innerException

我想使用Polly.net在.NET Core 3.1 gRPC客户端/服务器之间添加弹性,以处理退避重试策略。

我对gRPC的RpcException不满意。我想知道是否有更好的方法来检测强制关闭的远程连接。在客户端或gRpc服务重启后启动grpc时会发生这种情况。

内部异常是null,找到异常的唯一方法是解析错误消息-不如我所希望的那样可靠。

如何在RpcException中获得Win32异常?

private static IAsyncPolicy RetryTransientException()
{
    return Policy
        .Handle<RpcException>(rpcException => IsTransient(rpcException.StatusCode))
        .Or<RpcException>(IsRemoteForcedConnection)
        .WaitAndRetryForeverAsync(
            (retryAttempt,ctx) => TimeSpan.FromSeconds(Math.Pow(2,retryAttempt)),(exception,retries,timeSpan,context) =>
            {
                context.GetLogger()?.information(exception,"[onRetry] {0} Transient error attempt {1} to reconnect with gRpc server.",context.PolicyKey,retries);
            }
        )
        .WithPolicyKey(PolicyNames.PersistentClientStream + "-waitandretrytransienterrors");
}

private static bool IsTransient(StatusCode status)
{
    if (status == StatusCode.Unavailable)
        return true;
    if (status == StatusCode.DeadlineExceeded)
        return true;
    return false;
}

private static bool IsRemoteForcedConnection(RpcException rpcException)
{
    return rpcException.StatusCode == StatusCode.Internal
           && rpcException.Message.Contains("System.Net.sockets.socketException (10061)");
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。