0

我故意将超时设置为非常低,以使 http 调用崩溃以测试重试功能,但引发了异常,因此 httpClient 没有重试先前的请求。
起初我以为只有在 maxRetry 配置的一些尝试失败(HTTP 代码 500)之后,才会引发异常。

所以我的代码逻辑被破坏了,如果我强制执行再次执行 API 调用PostAsync,重试功能将毫无用处,代码也很脏。

IClient clientV2 = new FluentClient(apiClient.getBasedUrl());
clientV2.BaseClient.Timeout = TimeSpan.FromMilliseconds(50);
clientV2.SetRequestCoordinator(
    maxRetries: 3,
    shouldRetry: request => request.StatusCode != HttpStatusCode.OK,
    getDelay: (attempt, response) => { return TimeSpan.FromSeconds(1); } // 1, 2, and 3 seconds
);

try
{
    T result = clientV2.PostAsync(_RelativeURL)
                                 .WithHeader("APIKEY", apikey)
                                 .WithHeader("PAYLOAD", b64)
                                 .WithHeader("SIGNATURE", hmacSig)
                                 .As<T>()
                                 .Result;

    dynamicJSONResult = bitfinexTicker;
} catch (Exception ex)
{
    Console.WriteLine(ex);
}

System.AggregateException:发生一个或多个错误。--->
System.Threading.Tasks.TaskCanceledException:任务被取消。
--- 内部异常堆栈跟踪结束 ---
System.Threading.Tasks.Task.ThrowIfExceptional(Boolean includeTaskCanceledExceptions)
在 System.Threading.Tasks.Task 1.GetResultCore(Boolean waitCompletionNotification)
在 System.Threading.Tasks.Task 1 .get_Result()
at xxx.xx.xxQueryPrivate[T](ApiClient apiClient, String myHTTPMethod, String _RelativeURL, Int32 _myTimeOut, Object _payload) in zzz.cs:line 337

4

1 回答 1

0

这是 3.0 中添加的重试协调器的一个疏忽——如果服务器返回错误,它会重试,但如果请求在本地超时则不会。这在 3.1 中已修复。

于 2017-06-29T15:10:55.467 回答