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 > 如何禁用重试

httpclient怎么配置了一些基本参数和超时设置

httpclient默认超时时间是多少

为啥 C# HttpClient 不能调用这个 URL(总是超时)?

在 C# 中使用 Post 方法 HttpClient 时请求超时