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

如何在使用 Polly 重试之前记录某些内容?

如何解决如何在使用 Polly 重试之前记录某些内容?

在 .net 核心 web api 中使用 Polly 重试 web api 调用之前,我尝试记录一些内容

我知道 web api 失败并返回 503 响应代码,但是作为重试调用的一部分,我的控制台日志中没有任何内容。任何想法为什么以及如何解决这个问题?

var retryPolicy = Policy
    .Handle<HttpRequestException>()
    .Or<SocketException>()
    .WaitAndRetryAsync(new[]
    {
        TimeSpan.FromSeconds(2),TimeSpan.FromSeconds(5),TimeSpan.FromSeconds(10)
    },(exception,timeSpan,retryCount,context) =>
    {
        Console.Write("retrying - " + DateTime.Now.Second);
    });

await retryPolicy.ExecuteAsync(async () =>
{
    var serviceReturnLabel = await this.stockTransfeRSServiceClient.GetPRReturnLabel(ItemSourceType.ReturnLocker);

    if (serviceReturnLabel != null && serviceReturnLabel.Accepted)
    {
        returnLabel = serviceReturnLabel.PRLabel;
    }
});

解决方法

重试策略公开了一个钩子,您可以在其中连接将在重试之前调用的自定义代码惩罚。换句话说,只要应该触发策略,但在两次尝试之间的等待之前,就会调用此委托。

这个钩子被称为 onRetryonRetryAsync,具体取决于您的策略是同步还是异步。

您可以在此处查看何时调用这些用户定义的自定义委托:


所以,你已经连接到了正确的钩子。

现在您必须确保触发该策略。您可以使用 Console.Write 或一些记录器将信息从您的委托推送到标准输出。

或者您可以简单地在匿名 lambda 委托中设置一个断点,以确保在调试期间调用它。


如果它没有被调用,那么你必须检查以下内容:

  • 是否处理了抛出的异常?
  • 有什么例外吗?

从政策的角度来看,可以有两种异常:已处理和未处理。如果尚未达到阈值,前者可以触发新的尝试。后者不会触发另一次尝试,而是会重新抛出原始异常。 (Reference)

在您的情况下,策略已设置为在抛出 HttpRequestExceptionSocketException 时触发。如果抛出的异常不是这些异常,那么从策略的角度来看,它被认为是未处理的。

如果没有例外,您的政策将不会被触发。有一个典型的错误,我们已经犯过好几次了。假设我们期望 http 响应应该是 200。只要不成功,我们就想发出重试。我们可能会使用 HandleTransientHttpError (Ref) 扩展名。但该扩展程序仅监视 408 and 5xx status codes。因此,如果我们收到例如 429(请求过多),则不会发生重试。如果响应不成功,我们必须显式调用 EnsureSuccessStatusCode (Ref) 方法以抛出错误。

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