【小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;

//模拟用户请求设备信息 - chrome
request.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-8
string 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多,其他连接都在排队,等长时间没反应自然就出现超时的情况或者服务端异常情况。

【实现流程图】

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

猜你喜欢

转载自blog.csdn.net/lmy_520/article/details/109628298