c# HttpClient超时重试
Posted 凉生凉忆亦凉心
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了c# HttpClient超时重试相关的知识,希望对你有一定的参考价值。
c# HttpClient超时重试
//调用方式 3秒后超时 重试2次 .net framework 4.5 HttpMessageHandler handler = new TimeoutHandler(2,3000); using (var client = new HttpClient(handler)) using (var content = new StringContent(""), null, "application/json")) var response = client.PostAsync("url", content).Result; string result = response.Content.ReadAsStringAsync().Result; JObject jobj = JObject.Parse(result); if (jobj.Value<int>("code") == 1)
public class TimeoutHandler : DelegatingHandler private int _timeout; private int _max_count; /// <summary> /// 超时重试 /// </summary> /// <param name="max_count">重试次数</param> /// <param name="timeout">超时时间</param> public TimeoutHandler(int max_count = 3, int timeout = 5000) base.InnerHandler = new HttpClientHandler(); _timeout = timeout; _max_count = max_count; protected async override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) HttpResponseMessage response = null; for (int i = 1; i <= _max_count + 1; i++) var cts = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken); cts.CancelAfter(_timeout); try response = await base.SendAsync(request, cts.Token); if (response.IsSuccessStatusCode) return response; catch (Exception ex) //请求超时 if (ex is TaskCanceledException) MyLogService.Print("接口请求超时:" + ex.ToString()); if (i > _max_count) return new HttpResponseMessage(HttpStatusCode.OK) Content = new StringContent("\\"code\\":-1,\\"data\\":\\"\\",\\"msg\\":\\"接口请求超时\\"", Encoding.UTF8, "text/json") ; MyLogService.Print($"接口第i次重新请求"); else MyLogService.Error("接口请求出错:" + ex.ToString()); return new HttpResponseMessage(HttpStatusCode.OK) Content = new StringContent("\\"code\\":-1,\\"data\\":\\"\\",\\"msg\\":\\"接口请求出错\\"", Encoding.UTF8, "text/json") ; return response;
C# 中的 httpClient 调用超时,而 cUrl 正在工作
【中文标题】C# 中的 httpClient 调用超时,而 cUrl 正在工作【英文标题】:httpClient call in C# goes to timeout, while cUrl is working 【发布时间】:2021-04-23 07:56:29 【问题描述】:我对 httpClient 有一个奇怪的问题。 我正在尝试向远程 API 发出 GET 请求。 cUrl 在终端上运行良好,但具有相同请求的 httpClient 只会超时。 我使用https://curl.olsh.me/ 工具创建了 httpClient 并将等待时间设置为 2 分钟。 请求被触发后,它等待,但没有得到响应代码,并进入异常
2021-04-23 03:40:22.686 +01:00 [INF] httpRequest
2021-04-23 03:42:02.798 +01:00 [ERR] Exception Message : The operation has timed out.
请您猜猜可能是什么问题。提前谢谢你
【问题讨论】:
你能告诉我们你的代码吗? 可能是和***.com/questions/66072583/…类似的问题 这样的失败通常是由于三个不同的问题 1) 如果 30 秒后发生错误,则意味着代理超时。正在使用代理,但代理从未响应 2) 请求中的 HTTP 标头错误或丢失。 c# 中的默认标头与其他语言不同。 3) 您正在使用 HTTPS(安全)并且使用的 TLS 身份验证失败。 Cookie 可能不是问题。首次建立连接时会建立 cookie。然后在后续连接中使用 cookie 以减少连接时间。饼干只会有帮助。不会导致失败。 【参考方案1】:感谢所有评论的人,尤其是@jdweng。它让我知道在哪里寻找问题。 因此,超时问题是由 TLS 身份验证引起的。根证书未在服务器上导入。导入根证书后,问题解决了。
糟糕的是,无法从异常文本中找出确切的问题。
【讨论】:
那么你的问题并不包含解决这个特定问题所需的所有信息。 我发布了我当时掌握的所有信息以上是关于c# HttpClient超时重试的主要内容,如果未能解决你的问题,请参考以下文章
C# 中的 httpClient 调用超时,而 cUrl 正在工作
java: apache HttpClient > 如何禁用重试