首页 > 编程语言 >c# HttpClient超时重试

c# HttpClient超时重试

时间:2023-06-09 09:01:13浏览次数:57  
标签:count c# max 重试 int new 超时 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;
            }
        }

  

标签:count,c#,max,重试,int,new,超时,HttpClient
From: https://www.cnblogs.com/xxxin/p/17468171.html

相关文章

  • C# .NET CORE .NET6 RSA 公钥加密 私钥解密
    环境说明:.NETCORE版本:.NET6。 .NETCORE对于RSA的支持:1..NET6中内置了对PKCS1,PKCS82种私钥格式的支持。2.如果你要部署在Linux,docker,k8s中;一定要用“RSA”这个类,不能是.NETFRAMEWORK的 RSACryptoServiceProvider。3..NET中默认加密算法为“RSA/ECB......
  • C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?
    C++面试八股文:C++中指针、引用、解引用和取地址有什么不同?某日小二参加XXX科技公司的C++工程师开发岗位2面:面试官:指针、引用、解引用和取地址是C++中的重要概念,请问它们在语法和语义上有所不同?小二:指针是一个变量,它存储了一个内存地址。小二:引用是一个别名,它允许使用一个......
  • demosaicnet-master的包代码阅读笔记
    init.py我在学init用法时候的笔记该文件里面都是导入模块,其中从dataset.py是导入所有模块,因为模糊导入的__all__没有定义。from.modulesimportBayerDemosaickfrom.modulesimportXTransDemosaickfrom.mosaicimportxtransfrom.mosaicimportbayerfrom.mosaicim......
  • 51存储器块清零和二进制数转换成二十进制(BCD)码
    一、实验目的1、了解单片机实验开发板电路原理图2、掌握KEIL软件开发单片机C51程序的流程3、掌握单片机开发程序的烧录方法和流程二、实验内容1、完成单片机开发相关必备软件的安装2、学习单片机开发板套件的实验原理图3、编写、下载及实现第一个单片机程序(点亮一个LED灯)三......
  • C语言 #pragma指令
    简介#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的#pragma用于指示编译器完成一些特定的动作#pragma所定义的很多指示字是编译器特有的#pr......
  • C++面试八股文:C++中,设计一个类要注意哪些东西?
    某日二师兄参加XXX科技公司的C++工程师开发岗位第9面:面试官:C++中,设计一个类要注意哪些东西?二师兄:设计一个类主要考虑以下几个方面:1.面向对象的封装、继承及多态。2.bigthree或者bigfive。3.运算符和函数重载、静态成员、友元、异常处理等相关问题。面试官:请介绍一下面向对象......
  • 【LeetCode滑动窗口专题#2】无重复字符的最长子串
    #1传送门滑动窗口最大值长度最小的子数组无重复字符的最长子串给定一个字符串s,请你找出其中不含有重复字符的最长子串的长度。示例1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所以其长度为3。示例2:输入:s="bbbbb"输出:1解释:......
  • 用Spring Cloud Alibaba构建用户中心!只要5分钟
    你好,我是田哥。前几天,有几位朋友私信我,叫我写一个使用SpringCloudAlibaba搭建项目。今天,我给安排上,使用SpringCloudAlibaba搭建一个用户中心。下面,我就来给大家说一下,我饿还是如何搭建的,具体步骤如下:使用IDEA创建项目结构添加maven相关依赖安装Nacos业务代码整个技术栈:Spring......
  • 7.1 套接字(socket)
    套接字(socket)是计算机之间进行通信的一种技术,它允许不同主机上的进程之间进行数据交换。在Python中,我们可以使用socket模块来创建和使用套接字。首先,我们需要导入socket模块:importsocket在网络编程中,有两种主要类型的套接字:流套接字(StreamSockets)和数据报套接字(DatagramSoc......
  • win10 vs2022 搭建 cocos2d-x 3.17 开发环境
    引擎下载地址https://cocos2d-x.org/download/也可以在github下载https://github.com/cocos2d/cocos2d-x/tags手册地址https://docs.cocos2d-x.org/cocos2d-x/v3/zh/api文档地址https://docs.cocos2d-x.org/api-ref/cplusplus/v3x/index.htmlhelloworld安装注意事项......