3.10超时与重试策略
为单次请求设置超时时长。
设置超时时间#
为单次请求设置超时时长。
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)); // 自定义超时选项配置重试策略#
为单次请求配置重试策略。默认情况下,若已配置重试策略,则当请求出现未被抑制的异常时,将自动触发重试机制。
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>?类型)。如果设置了此属性,则重试次数将等于数组长度,MaxRetries和UseExponentialBackoff将被忽略。每次重试将按顺序使用数组中对应索引的间隔时间。RetryStatusCodes:内容大小(HashSet<HttpStatusCode>?类型)。需要重试的HTTP状态码集合。若为空,则仅重试因异常引发的失败。RetryExceptionTypes:需要重试的异常类型集合(HashSet<Type>?类型)。若为空,则对所有Exception进行重试(受MaxRetries限制)。OnRetry:OnRetry:每次重试前的回调委托(Action<HttpRetryContext>?类型)。可用于记录日志、发送通知等。若未设置此回调,框架将自动输出默认的重试警告日志。 参数为HttpRetryContext,包含以下属性:Attempt:当前重试次数(int类型)。从1开始。Exception:触发重试的异常(Exception?类型)。StatusCode:触发重试的HTTP状态码(HttpStatusCode?类型)。MaxRetries:最大重试次数(int类型)。-1表示无限(日志中显示为∞)。IsExceptionRetry:是否因异常触发(bool类型)IsStatusCodeRetry:是否因状态码触发(bool类型)
RetryIndefinitely:是否无限重试,直到成功(bool类型)。默认值为:false。当设置为true时,MaxRetries和RetryIntervals的长度将被忽略,一直重试直到成功或发生不可重试的异常。
-
方法:
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):设置是否无限重试。