900字范文,内容丰富有趣,生活中的好帮手!
900字范文 > 【小5聊】C#模拟Http并发请求超时解决方法HttpWebRequest

【小5聊】C#模拟Http并发请求超时解决方法HttpWebRequest

时间:2023-04-15 19:38:57

相关推荐

【小5聊】C#模拟Http并发请求超时解决方法HttpWebRequest

【前置条件】

开启1000个线程,每一个线程执行一个http请求

List<taskList> list=new List<taskList>();//监测线程的方法Task.Run(() => monitorTask());//开启线程 - 一条记录一个线程var tasks = taskList.Select(m =>{return Task.Run(() => taskWay(m));});Task.WhenAll(tasks);

【超时情况】

HttpWebRequest request = null;request = WebRequest.Create(url) as HttpWebRequest;request.Method = "GET";//请求数据为json格式字符串数据request.ContentType = "application/json;charset=UTF-8";//关闭长连接request.KeepAlive = false;//模拟用户请求设备信息 - chromerequest.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/525.13 (KHTML, like Gecko) Chrome/0.2.149.27 Safari/525.13";//请求超时时间request.Timeout=100*1000; //请求超时前等待的毫秒数。 默认值是 100,000 毫秒(100 秒)。//获取请求响应信息 - gb2312/utf-8string content="";HttpWebResponse response = request.GetResponse() as HttpWebResponse;using (StreamReader sr = new StreamReader(response.GetResponseStream(), 'gb2312')){content = sr.ReadToEnd();sr.Close();sr.Dispose();response.Close();}//特别要注意的地方 - request和response是同时使用的,如果Request.Abort的话,那么Response读取值会报错,所以request取消时要在response完成之后if (response != null){response.Close();}if (request != null){request.Abort();}

【解决超时代码】

ServicePointManager.DefaultConnectionLimit = 10*1000;

不知道为啥,最后一个http请求成功没有被监控到

温馨提示:请求超时,代码逻辑上虽然判断是http请求失败,但是也有可能是http请求操作成功,比如添加数据添加成功了,返回信息却是超时的情况

设置100万并发,在1个半小时依然出现超时的情况。所以,如果不是准备数据的情况下,那么可以设置有一定规律时间内并发也许解决超时的情况。

原因

【思路错误】

思路错误了,得出错误结论,方案自然也是错误的

其实上面出现超时,再设置100万个并发限制,这个方式是不合理的,方向不对。超时,说明是服务器端,比如IIS对累计太多的http请求响应不过来

【合理设计】

1)客户端,一般按量来调整并发数量,500到1000都可以了

2)服务端,看服务器硬件等配置,IIS连接数的最大支持数

客户端和服务端之间设计一个合理范围,这样才不会出现服务端响应不过来的情况。

第一次出现不合理的情况,由于没理解到位,一直调整客户端的并发数从10万到100万,其实是没有意义的,因为这样只会提高,发送出去的http请求数量,但是服务器响应不过来,可能处理请求5个每秒,累计连接数量在900多,其他连接都在排队,等长时间没反应自然就出现超时的情况或者服务端异常情况。

【实现流程图】

总结:只有理解了其中的原理和逻辑,才能设计出合理的方案!生活中,任何事情都是这样的道理!每天进步一点点,你就是最棒的!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。