如何解决如何在使用 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;
}
});
解决方法
重试策略公开了一个钩子,您可以在其中连接将在重试之前调用的自定义代码惩罚。换句话说,只要应该触发策略,但在两次尝试之间的等待之前,就会调用此委托。
这个钩子被称为 onRetry
或 onRetryAsync
,具体取决于您的策略是同步还是异步。
您可以在此处查看何时调用这些用户定义的自定义委托:
所以,你已经连接到了正确的钩子。
现在您必须确保触发该策略。您可以使用 Console.Write
或一些记录器将信息从您的委托推送到标准输出。
或者您可以简单地在匿名 lambda 委托中设置一个断点,以确保在调试期间调用它。
如果它没有被调用,那么你必须检查以下内容:
- 是否处理了抛出的异常?
- 有什么例外吗?
从政策的角度来看,可以有两种异常:已处理和未处理。如果尚未达到阈值,前者可以触发新的尝试。后者不会触发另一次尝试,而是会重新抛出原始异常。 (Reference)
在您的情况下,策略已设置为在抛出 HttpRequestException
或 SocketException
时触发。如果抛出的异常不是这些异常,那么从策略的角度来看,它被认为是未处理的。
如果没有例外,您的政策将不会被触发。有一个典型的错误,我们已经犯过好几次了。假设我们期望 http 响应应该是 200。只要不成功,我们就想发出重试。我们可能会使用 HandleTransientHttpError
(Ref) 扩展名。但该扩展程序仅监视 408 and 5xx status codes。因此,如果我们收到例如 429(请求过多),则不会发生重试。如果响应不成功,我们必须显式调用 EnsureSuccessStatusCode
(Ref) 方法以抛出错误。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。