如何在重试使用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委托中设置一个断点,以确保在调试期间调用它。


如果未调用,则必须检查以下内容:

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

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

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

如果没有异常,则不会触发您的策略。有一个典型的错误,我们已经犯了好几次了。假设我们期望http响应应该是200。如果不成功,则我们希望发出重试。我们可以使用HandleTransientHttpError(Ref(扩展。但该扩展只监视408和5xx状态代码。因此,如果我们接收到例如429(太多请求(,则不会发生重试。如果响应不成功,我们必须显式调用EnsureSuccessStatusCode(Ref(方法来抛出错误。

相关内容

  • 没有找到相关文章

最新更新