- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
任何人都知道为什么下面的政策在 3 次而不是 10 次后停止重试?
IAsyncPolicy<HttpResponseMessage> httpWaitAndRetryPolicy =
Policy.HandleResult<HttpResponseMessage>(r => !r.IsSuccessStatusCode)
.OrHandle<Exception>(r => true)
.WaitAndRetryAsync(10, retryAttempt => TimeSpan.FromSeconds(2));
我将重试尝试设置为 10 并测试带有 BadRequest 失败的 http post 调用。
----> System.Threading.Tasks.TaskCanceledException : A task was canceled.
at System.Threading.Tasks.Task`1.GetResultCore(Boolean waitCompletionNotification)
at HttpRetry.Lab.Tests.ServiceTest.WhenPostWrongAlert_ThenRecoversProperly() in C:\ServiceTest.cs:line 56
--TaskCanceledException
15:57:03.6367 INFO HttpClientProvider - Configuring client xxxxxxxx:1234/api/" timeout=00:02:00
15:57:03.6636 INFO Service - POST xxxx/xxxxxxx
15:57:04.2051 INFO HttpClientProvider - Retrying retryCount=1 sleepDuration=00:00:02 result=Polly.DelegateResult`1[System.Net.Http.HttpResponseMessage]
15:57:06.6880 INFO HttpClientProvider - Retrying retryCount=2 sleepDuration=00:00:02 result=Polly.DelegateResult`1[System.Net.Http.HttpResponseMessage]
15:59:03.6811 INFO HttpClientProvider - Retrying retryCount=3 sleepDuration=00:00:02 result=Polly.DelegateResult`1[System.Net.Http.HttpResponseMessage]
15:59:03.6811 ERROR ServiceTest - System.Threading.Tasks.TaskCanceledException: A task was canceled.
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at HttpRetry.Lab.Service.<PostAsync>d__4.MoveNext() in C:\Service.cs:line 38
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task)
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter`1.GetResult()
at HttpRetry.Lab.Tests.ServiceTest.<PostAsync>d__4.MoveNext() in C:\ServiceTest.cs:line 27
var serviceProvider = serviceConnection.AddHttpClient(connection.Name, c =>
{
c.BaseAddress = new Uri(connection.BaseUrl);
c.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes($"{connection.UserName}:{connection.Password}")));
c.Timeout = connection.Timeout; // Timeout is TimeSpan.FromSeconds(120)
})
.AddPolicyHandler(httpWaitAndRetryPolicy)
.Services.BuildServiceProvider();
HttpClientFactories.Add(connection.Name, serviceProvider.GetService<IHttpClientFactory>());
确认问题的根本原因:
最佳答案
你的超时
正如我所看到的,您在 HttpClient 级别上有 1 分钟的全局超时。这将抛出 TaskCanceledException
即使您可能期望 TimeoutException
.
如果您希望收到 TimeoutException
那么你必须通过 RequestTimeout
指定一个基于请求的超时。 HttpRequestMessage
的属性(property).更多详情请查看the following link .
您的重试
您的重试逻辑定义了 3 次(或 10 次)重试,惩罚为 5 秒。 3 次重试意味着 4 次尝试,因为有一个初始(第 0 个)请求,它超出了重试范围。如果失败,那么第一次重试将成为第二次尝试。
所以流程将如下所示:
TaskCanceledExpcetion
由于全局超时。
retryPolicy.WrapAsync(timeoutPolicy);
如果您的重试策略包含在超时内,它可以充当全局超时:
timeoutPolicy.WrapAsync(retryPolicy);
当然,您也可以同时拥有全局和本地超时:
Policy.WrapAsync(globalTimeoutPolicy, retryPolicy, localTimeoutPolicy);
我强烈建议您考虑使用 Polly 的 Timeout 而不是 HttpClient 的 Timeout,以便在一个地方定义您的弹性策略。
TimeoutRejectedException
如果超时没有响应。因为您的重试处理各种异常 (
.OrHandle<Exception>()
),所以您不需要修改重试策略。
HttpPolicyExtensions.HandleTransientHttpError()
它捕获
HttpRequestException
并检查响应的状态码是否为
5xx 或
408 (请求超时)。
onRetry
或
onRetryAsync
分别用于同步或异步重试。您通过在您的
WaitAndRetryAsync
中提供以下委托(delegate)您可以获得非常有用的信息:
onRetryAsync: (exception, delay, times, context) => {
//TODO: logging
}
关于c# - HttpClient Polly WaitAndRetry 策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62806212/
我正在尝试为我的 Rest 客户创建一个综合弹性策略,为此我编写了以下内容: private static Policy circuitBreakerPolicy = Policy .Han
我以前从未使用过 Polly,不确定这是否适合 Polly。 我正在调用 POST 正文中包含 1000 个 DTO 列表的端点。现在,端点将对每个 DTO 执行一些验证,如果这些 DTO 中的任何一
我将 Polly 与 .net Core 结合使用。我的 ConfigureServices 是: private static void ConfigureServices() { var
我正在使用 .NET 5 并希望使用 Polly 在重试时更改请求的查询字符串。背景 - 我有一个固定的每分钟请求配额,这是我的 IP 地址所允许的。如果超过限制,我会得到一个特定的 4xx 状态代码
Polly 中是否有办法重试除指定异常之外的所有异常。例如: var p = Policy .Handle(e => !(e.NativeErrorCode == 1)) .Or()
我们正在考虑使用 Polly 作为我们的故障转移库。 我们在 kubernetes 环境中运行我们的应用程序。例如,我们无法保证针对特定服务运行重试尝试的 pod 将存活足够长的时间以使请求成功。如果
我正在尝试使超时策略正常工作。我在集成 api 时有以下需求。 创建一个 http 请求来调用 endpoint1 并传递 transactionID 并捕获结果 如果 http 请求在 20 秒内没
在启动过程中,我基本上添加了一个 HttpClient,如下所示: services.AddHttpClient().AddPolicyHandler(GetRetryPolicy()); publi
在策略定义中,我希望能够在运行时禁用或启用该策略,而不是在调用站点中进行,因为我可能有多个调用站点。 这是我目前的方法? private RetryPolicy GetRetryPolicy() {
我对波利很陌生。我做了一些研究,但仍然无法确定是否/如何仅在请求失败时以优雅的方式使用 Polly 来使用 chached 值。例子: 服务 A 想通过 http 从服务 B 获取数据。我总是想获取最
我正在使用 AWS Polly 服务进行文本转语音。但是如果文本包含一些特殊字符,它会返回错误的开始和结束编号。 例如,如果文本是:“Böylelikle”,它返回:{"time":6,"type":
我试图重试失败的操作 3 次。 我正在使用 Polly 进行重试操作。 我想在重试操作失败的情况下获得异常并重试 2 次,依此类推。 return await Policy .H
我已经阅读了 Polly 库的文档和示例,它真的很棒而且易于使用!! 就我而言,我想将所有异常分为 3 种类型:临时、永久和日志。现在,我想要一段代码,负责通过使用 Polly 库进行等待和重试来处理
我在 PolicyRegistry 中有以下政策可以在全局范围内重复使用: var fallbackPolicy = Policy .Handle().OrInner()
我正在尝试检查 Polly 的简单 RetryForever class Program { public static void Main() {
我已经阅读了 Polly 库的文档和示例,它真的很棒而且易于使用!! 就我而言,我想将所有异常分为 3 种类型:临时、永久和日志。现在,我想要一段代码,负责通过使用 Polly 库进行等待和重试来处理
我在 PolicyRegistry 中有以下政策可以在全局范围内重复使用: var fallbackPolicy = Policy .Handle().OrInner()
我正在使用一个非常不稳定的 API。有时我会收到 500 服务器错误 和 Timeout,有时我也会收到 500 服务器错误,因为我给它提供了它无法处理的输入 SqlDateTime overflow
我正在尝试检查 Polly 的简单 RetryForever class Program { public static void Main() {
我想执行某个操作,如果失败3次则返回null。 Polly 中类似的东西将是完美的: var results = await Policy> .Handle() .RetryAsync
我是一名优秀的程序员,十分优秀!