在.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;
}
});
重试策略公开了一个钩子,您可以在其中连接一个自定义代码,该代码将在重试惩罚之前调用。换句话说,只要应该触发策略,但在两次尝试之间的等待之前,就会调用此委托。
此挂钩被称为onRetry
或onRetryAsync
,具体取决于您的策略是同步还是异步。
在这里,您可以看到这些用户定义的自定义委托何时被调用:
- 同步重试策略
- 异步重试策略
因此,您已连接到右挂钩。
现在,您必须确保触发了该策略。您可以使用Console.Write
或某些记录器将信息从您的代理推送到标准输出。
或者,您可以简单地在匿名lambda委托中设置一个断点,以确保在调试期间调用它。
如果未调用,则必须检查以下内容:
- 是否处理了抛出的异常
- 有什么例外吗
从策略的角度来看,可以有两种异常:已处理和未处理。如果尚未达到阈值,则前者可以触发新的尝试。后者不会触发另一次尝试,而是会重新抛出原始异常。(参考(
在您的情况下,策略已设置为在抛出HttpRequestException
或SocketException
时触发。如果抛出的异常不是这些异常,则从策略角度来看,它被认为是未处理的。
如果没有异常,则不会触发您的策略。有一个典型的错误,我们已经犯了好几次了。假设我们期望http响应应该是200。如果不成功,则我们希望发出重试。我们可以使用HandleTransientHttpError
(Ref(扩展。但该扩展只监视408和5xx状态代码。因此,如果我们接收到例如429(太多请求(,则不会发生重试。如果响应不成功,我们必须显式调用EnsureSuccessStatusCode
(Ref(方法来抛出错误。