3.10超时与重试策略

为单次请求设置超时时长。

设置超时时间#

为单次请求设置超时时长。

cs
HttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(TimeSpan.FromSeconds(2));HttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(2000);  // 毫秒单位HttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(-1);  // 永不超时,或使用 .WithoutTimeout(),或设置为 System.Threading.Timeout.InfiniteTimeSpanHttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(0);  // 立即取消请求HttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(TimeSpan.FromSeconds(2), () =>  // 支持超时回调    {        // 超时发生时要执行的操作    });HttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(2000, () => // 支持超时回调    {        // 超时发生时要执行的操作    });HttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(new HttpTimeoutOptions());  // 自定义超时选项HttpRequestBuilder.Get("https://furion.net/")    .SetTimeout(options => options.SetTimeout(2000));  // 自定义超时选项

配置重试策略#

为单次请求配置重试策略。默认情况下,若已配置重试策略,则当请求出现未被抑制的异常时,将自动触发重试机制。

cs
HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(3);   // 最大重试次数,0 表示不重试HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(3, ctx => Console.WriteLine($"这是第 {ctx.Attempt} 次重试."));    // 配置每次重试前的回调委托HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(3, TimeSpan.FromSeconds(1));  // 配置重试间隔时间HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(3, TimeSpan.FromSeconds(1), ctx => Console.WriteLine($"这是第 {ctx.Attempt} 次重试."));    // 配置每次重试前的回调委托HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(3, 1000);  // 配置重试间隔时间(毫秒)HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(3, 1000, ctx => Console.WriteLine($"这是第 {ctx.Attempt} 次重试."));    // 配置每次重试前的回调委托HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(new HttpRetryOptions());    // 自定义重试选项HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(options => options.SetMaxRetries(3));    // 自定义重试选项HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(options => options.SetMaxRetries(3)                .AddRetryStatusCodes(401));    // 对特定 HTTP 状态码进行重试HttpRequestBuilder.Get("https://furion.net/")    .SetRetry(options => options.SetMaxRetries(3)                .AddRetryExceptions(typeof(InvalidOperationException)));    // 对特定异常类型进行重试HttpRequestBuilder.Get("https://furion.net/")    .SetRetryIndefinitely();    // 设置无限重试,直到成功

HttpRetryOptions 包含以下属性和方法:

  • 属性

    • MaxRetries:最大重试次数(int 类型)。默认值为 0,表示不重试。如果设置了 RetryIntervals,此值将自动被覆盖为数组长度。
    • RetryInterval:重试间隔基准时间(TimeSpan 类型)。默认值为 1 秒。仅在未设置 RetryIntervals 时生效。
    • UseExponentialBackoff:是否采用指数退避重试(bool 类型)。默认值为:false。当设置为 true 时,每次重试间隔 = RetryInterval * 2^(retry-1)。仅在未设置 RetryIntervals 时生效。
    • RetryIntervals:自定义重试间隔数组(IList<TimeSpan>? 类型)。如果设置了此属性,则重试次数将等于数组长度,MaxRetriesUseExponentialBackoff 将被忽略。每次重试将按顺序使用数组中对应索引的间隔时间。
    • RetryStatusCodes:内容大小(HashSet<HttpStatusCode>? 类型)。需要重试的 HTTP 状态码集合。若为空,则仅重试因异常引发的失败。
    • RetryExceptionTypes:需要重试的异常类型集合(HashSet<Type>? 类型)。若为空,则对所有 Exception 进行重试(受 MaxRetries 限制)。
    • OnRetryOnRetry:每次重试前的回调委托(Action<HttpRetryContext>? 类型)。可用于记录日志、发送通知等。若未设置此回调,框架将自动输出默认的重试警告日志。 参数为 HttpRetryContext,包含以下属性:
      • Attempt:当前重试次数(int 类型)。从 1 开始。
      • Exception:触发重试的异常(Exception? 类型)。
      • StatusCode:触发重试的 HTTP 状态码(HttpStatusCode? 类型)。
      • MaxRetries:最大重试次数(int 类型)。-1 表示无限(日志中显示为 )。
      • IsExceptionRetry:是否因异常触发(bool 类型)
      • IsStatusCodeRetry:是否因状态码触发(bool 类型)
    • RetryIndefinitely:是否无限重试,直到成功(bool 类型)。默认值为:false。当设置为 true 时,MaxRetriesRetryIntervals 的长度将被忽略,一直重试直到成功或发生不可重试的异常。
  • 方法

    • SetMaxRetries(maxRetries):设置最大重试次数。
    • SetRetryInterval(interval)SetRetryInterval(milliseconds):设置重试间隔基准时间。
    • SetUseExponentialBackoff(use):设置是否使用指数退避。
    • SetRetryIntervals(intervals)SetRetryIntervals(milliseconds):设置自定义重试间隔数组。
    • AddRetryStatusCode(statusCode):添加一个需要重试的 HTTP 状态码。
    • AddRetryStatusCodes(statusCodes):添加多个需要重试的 HTTP 状态码。
    • AddRetryException<TExcetion>()AddRetryException(exceptionType):添加一个需要重试的异常类型。
    • AddRetryExceptions(exceptionTypes):添加多个需要重试的异常类型。
    • SetOnRetry(onRetry):设置每次重试前的回调委托。
    • SetRetryIndefinitely(retryIndefinitely):设置是否无限重试。