.NET 多线程发送WebRequest访问失败,异常信息:"WebException,基础连接已关闭:连接意外关闭。"(ServicePointManager最大并发数已修改) ,请做过这方面的专家指点一二。

奋斗的萝卜 2008-11-27 09:20:54
前段时间公司要求让我完成一个测试工具,此测试工具用于测试广域网负载均衡。我们的目的是测试客户的负载均衡设备是否正常运转,以及在各种情况下负载均衡设备的运行状况,以保证最终的客户能够时时访问到应用。
工具的结构和实现已经大部分完成了,但是在测试阶段,却发现了一些问题,这些问题十分没有规律性,可能涉及一些网络网络方面的知识,本人虽然做的是Web开发,但是对于网络只是也是知之甚少,通过了很长一段的研究,还是没能找到根源。现在将问题分享给大家,希望大家都能有所收获。

程序问题:
1.WebRequest的形式访问服务地址,运行一段时间后系统抛出异常,异常信息是:"WebException,基础连接已关闭:连接意外关闭。"
这个应用是在工具的一个场景里使用,场景可以设置这次运行的属性,例如启动的线程数量,请求的服务地址和比例,请求间隔的时长,执行测试的时间等等。通过这些基本属性的设置,工具根据测试时长和间隔,创造出指定的线程数量,每个线程去执行请求(WebRequest实现),并接收返回的信息。接收反馈的信息主要是访问的状态码是否是200 OK,并不将内容Down下来。(如果将内容Down下来的话,只是10个并发的Stream读流,就会让工具的互操作性降低很多,界面信息的刷新将十分缓慢,整个工具有点崩溃的前兆。还好客户没有要求计算网络流量,否则这个问题就是今天主要的话题之一了。当然,如果有哪位专家明白这其中的问题,到希望能指点一二。)我们切回正题,虽然只接受状态吗,但是工具仍会在执行了一段时间之后(周期不固定),访问的成功率开始降低,在这种情况之后几乎没有什么成功访问。在经过多次捕捉记录,发现异常信息是连接过早关闭。关键代码如下;
Code:
string uri = "http://domain:post/Service/MyService"; //连接假设有效
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri); //创建请求实例
request.CachePolicy = new RequestCachePolicy(RequestCacheLevel.NoCacheNoStore); //忽略缓存,完全使用服务器满足请求
request.Timeout = 5000; //等待超时的时间长度
HttpWebResponse response = (HttpWebResponse)request.GetResponse(); //获得响应

if(response.StatusCode==HttpStatusCode.Ok)
{......}
else
{......}

以上的代码,是请求发送的核心代码。每个线程都独立拥有这段代码,并且开启线程之前设置了代码ServicePointManager的属性如下:

ServicePointManager.CheckCertificateRevocationList = true; //检查证书吊销列表
ServicePointManager.DefaultConnectionLimit = 500; //最大并发500

在这种情况下,n 个并发的循环不停的进行请求,然后统计结果。可惜的是最初访问的成功率很高,经过了一段时间之后,成功率开始暴跌,而且没有回升的趋势。一旦出现错误,后边的请求都会失败。基础连接关闭则访问都是失败的,这的基础连接指的是什么?意外关闭的原因在哪?请专家们同仁们给予帮助。
...全文
1616 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
caaaa 2011-12-24
  • 打赏
  • 举报
回复
汗,好老的帖子啊,出现这种问题一般是因为request和response没有释放造成的,在请求处理完毕对请求调用abort,对response调用close处理一下就好了
successful_cdr 2011-11-30
  • 打赏
  • 举报
回复
我也遇到基础连接关闭,情况如下

向服务器端webservice,发送几十M的数据
调用webservice 出现基础连接已经关闭,发送错误

zengxin2008 2010-11-26
  • 打赏
  • 举报
回复
我也顶一个,我现在正在做这个,遇到的问题跟你差不多,就程序运行帮小时后就会报503错误,有时候也会报基础连接已关闭,不知道楼主解决了你的问题没有,能不能分享下你的经验
chichenzhe 2010-09-08
  • 打赏
  • 举报
回复
[Quote]
n 个并发的循环不停的进行请求,然后统计结果。可惜的是最初访问的成功率很高,经过了一段时间之后,成功率开始暴跌,而且没有回升的趋势。一旦出现错误,后边的请求都会失败。基础连接关闭则访问都是失败的,这的基础连接指的是什么?意外关闭的原因在哪?请专家们同仁们给予帮助。[/Quote]

大部分原因是防火墙问题.
因为你不太清楚他那边的安全机制,不知道他们是否会对同一IP频繁访问进行阻截.
renli0404 2010-09-08
  • 打赏
  • 举报
回复
我最近也遇到这样的问题了,不知道楼主解决了没
mistysunlight 2009-05-31
  • 打赏
  • 举报
回复
不知道现在的这个问题有没有得到明确的答案?
W422080367 2009-05-31
  • 打赏
  • 举报
回复

/// <summary>
/// Post方式请求页面资源
/// </summary>
/// <param name="strURL">请求页面的URL</param>
/// <param name="command">要写入的上下文</param>
/// <param name="strReferer"></param>
/// <returns></returns>
public string PostHttp(string strURL, string command, string strReferer)
{
lock (this)
{
try
{
string strResult = "";
HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(strURL);

myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
myHttpWebRequest.Method = "POST";

myHttpWebRequest.KeepAlive = true;
myHttpWebRequest.AllowAutoRedirect = false;

myHttpWebRequest.Accept = "image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/msword, application/x-shockwave-flash, */*";
myHttpWebRequest.UserAgent = "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; Maxthon; .NET CLR 2.0.50727)";
myHttpWebRequest.Referer = strReferer;
myHttpWebRequest.Headers.Add("Cookie: " + this.cookie);

Stream MyRequestStrearm = myHttpWebRequest.GetRequestStream();
StreamWriter MyStreamWriter = new StreamWriter(MyRequestStrearm, Encoding.ASCII);

MyStreamWriter.Write(command);
MyStreamWriter.Close();
MyRequestStrearm.Close();
HttpWebResponse response = null;
System.IO.StreamReader sr = null;
response = (HttpWebResponse)myHttpWebRequest.GetResponse();
sr = new System.IO.StreamReader(response.GetResponseStream(), Encoding.UTF8);

strResult = sr.ReadToEnd();

return strResult;
}
catch (Exception ex)
{
File.AppendAllText(@"C:\exception.txt", DateTime.Now.ToShortTimeString() + "--Post\n", Encoding.Default);
return PostHttp(strURL, command, strReferer);

}
}
}


这是我以前写的一个网页游戏外挂的获取网页信息的一个方法, 经常也会遇到基础流关闭的问题,我是在catch块中递归调用该方法,问题就解决了。
但是不知道对你有没有效, 你可以设置一个变量来控制递归调用的次数,如果没有控制次数就会一直递归 知道连接上为止.
half_bucket 2008-12-07
  • 打赏
  • 举报
回复
基础链接关闭的话,明显是你的service url不允许你进行连接了,检查网络连接和authentication,webrequest是通过tcpip走,这种webservice会将一个失败的链接记录下来,然后等待,也许你reboot server就解决了问题,但又会出现,说明还是程序和数据有问题。
maston 2008-12-07
  • 打赏
  • 举报
回复
我也遇到同样的问题,但不同的是虽然同一个程序我关闭了访问网络的进程,然后再重新写一个新进程,新进程仍然不能访问网络,但如果将程序关闭后再重新运行,则一切恢复正常。
另外,如果我在程序不能访问网络时中断程序,查看相应的HttpWebRequest变量的各个参数,系统提示“属性计算失败”。很奇怪。但可以确定的是相应的httpwebrequest变量并没有变成null

这种奇怪的情况我想应该经常出现的,其他朋友没有遇到吗?
奋斗的萝卜 2008-11-28
  • 打赏
  • 举报
回复
UP 一下。
hangang7403 2008-11-27
  • 打赏
  • 举报
回复
up
wangping_li 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用楼主 gjmlzrj 的帖子:]
在这种情况下,n 个并发的循环不停的进行请求,然后统计结果。可惜的是最初访问的成功率很高,经过了一段时间之后,成功率开始暴跌,而且没有回升的趋势。一旦出现错误,后边的请求都会失败。基础连接关闭则访问都是失败的,这的基础连接指的是什么?意外关闭的原因在哪?请专家们同仁们给予帮助。
[/Quote]
因为第一个失败原因就是因为服务端服务已经中止了,所以后面的访问都会失败.我不知道你服务端具体是怎么处理的
wgl666666 2008-11-27
  • 打赏
  • 举报
回复
绑顶下啊学习学习
wangping_li 2008-11-27
  • 打赏
  • 举报
回复
基础连接指就是你服务端的东西
比如你做一个程序分服务器端和客户端(客户端的方法全部来自于服务端)
这时你调试单步客户端的方法可以转到服务器端去,在调试间你把服务端的Debug关掉后,客户端就会收到一个基础连接已关闭的异常
我理解应该是你客户端请求的时候,服务端意外中断了
奋斗的萝卜 2008-11-27
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangping_li 的回复:]
引用楼主 gjmlzrj 的帖子:
在这种情况下,n 个并发的循环不停的进行请求,然后统计结果。可惜的是最初访问的成功率很高,经过了一段时间之后,成功率开始暴跌,而且没有回升的趋势。一旦出现错误,后边的请求都会失败。基础连接关闭则访问都是失败的,这的基础连接指的是什么?意外关闭的原因在哪?请专家们同仁们给予帮助。

因为第一个失败原因就是因为服务端服务已经中止了,所以后面的访问都会失败.我不知道你服务端具体…
[/Quote]


一旦出现错误,后边的请求都会失败。基础连接关闭则访问都是失败的。


我来解释一下:
1.“一旦出现错误,后边的请求都会失败”,就是说访问时出现了访问失败的情况,也就是状态码不再是200 OK,那么慢慢的就会发现,其他的线程也会跟着访问失败。
2.“基础连接访问关闭则都是失败的”,就是说错误的原因是基础连接关闭,则访问都是失败的。

另外我想说明,服务端的应用(应用指的是Web程序)不是我们开发的,服务端跟我们测试开发的工具没有任何的联系。

现在我已经进行了多种情况的错误排查,感觉好像是防火墙屏蔽我的请求了,防火墙可能防止了DDOS攻击,所以我这种频繁的访问,可能被他认为是恶意攻击,之后断掉了与我的链接。因为防火墙只认主机,也就是ip,所以我为了测试是不是防火墙把我毙掉了,我先开启了一个工具,对服务进行访问,当发生错误率时,我又开启了一个新的工具,同时进行服务访问,结果表明,第二个开启的测试工具,一开始就是错误的访问。也就是说第二个工具受第一个工具失败的影响,一开始就失败。这证明了不是工具本身的代码所致,可能是因为服务端防火墙的原因。

另外还有可能,是KeepAlive连接的时间过长,服务器将基础连接毙掉了!也就是说我的多线程http的访问,实际上是基于同一个TCP/IP连接。当KeepAlive在服务端的超时失效时,我的TCP/IP连接被断开,也就是基础连接被断开。所以我的其他线程都受到影响,访问也就是败了。在这我通过不断地调试,观察,最后我发现再多的WebRequest请求使用的ServicePoint对象都是同一个,也就是说是ServicePoint产生了问题,才导致了我其他线程的执行失败。但究竟是防火墙毙掉了我,还是KeepAlive超时造成的连接中断,我也不清楚。总之在访问一些成熟网站的某个URL时,总是会在一定时间后开始访问失败的情况,而错误的信息就是基础连接关闭。

我曾经质疑ServicePoint不带有修复连接的功能,也就是说同一个实例如果失败一次,则他本身不能自动修复,而我的其他请求都是基于他的,所以请求都是失败的。为此我制造了一个测试场景,就是启动测试工具,访问URL,开始成功率很高,访问都很正常,这个时侯我拔掉网线,失败率开始下降。此时我再接上网线,结果失败率有些回升,这证明ServicePoint本身还是有修复功能的。

现在我发现的情况就只有这些,客户那边最新的状况是访问基本不出现错误,我感到很诧异。越来越开始怀疑网络质量对测试工具的影响。

感谢各位的积极响应,郑某在这感激各位的关注。
内容概要:本文围绕“非线性流量的数据驱动Koopman模型预测控制研究”展开,提出一种基于数据驱动的Koopman算子理论方法,用于构建非线性系统的线性化状态空间模型,并结合模型预测控制(MPC)实现对复杂非线性系统的高效控制。研究通过引入扩展动态模态分解(EDMD)等观测函数,将非线性动力学映射至高维特征空间,在该空间中实现近似线性化表征,进而融合线性MPC框架进行优化求解。全文系统阐述了Koopman算子的数学基础、隐式线性化机制及在非线性流量控制中的建模流程,并通过Matlab代码完成了算法实现与仿真实验,验证了该方法在处理无精确物理模型、强非线性、时变动态系统中的有效性与鲁棒性,尤其适用于工业流程控制、能源系统调度等实际工程场景。; 适合人群:具备自动控制理论、非线性系统分析基础,熟悉Matlab编程,从事控制工程、系统辨识、智能优化、能源系统建模等方向的研究生、科研人员及工程技术人员。; 使用场景及目标:①应用于难以建立精确数学模型的复杂非线性系统(如流体动力系统、电力电子系统、机器人动力学等)的建模与实时控制;②实现数据驱动下的模型预测控制,提升系统响应速度与控制精度;③为先进控制策略(如MPC)提供一种可行的线性化建模范式,推动现代控制理论与数据科学、机器学习的深度融合。; 阅读建议:建议读者结合提供的Matlab代码深入理解Koopman方法的具体实现过程,重点关注观测函数构造、核函数选择、矩阵逼近、降维处理及MPC控制器设计等关键技术环节,并尝试将其迁移至其他非线性系统中进行复现实验与性能对比,以全面掌握其适用范围与局限性。
内容概要:本文详细介绍了一种基于Simulink的光伏储能单相逆变器并网仿真模型,系统涵盖了光伏阵列、储能单元、DC-AC单相逆变器及并网接口的完整结构,重点实现了储能环节的能量管理与逆变器并网控制策略的建模仿真。通过Simulink平台构建系统模型,验证了逆变器输出电能质量、并网稳定性以及控制系统的动态响应性能,采用SPWM调制、PI闭环控制等关键技术,确保并网电流与电网电压同频同相,满足并网电能质量要求。该模型不仅可用于分布式能源系统的仿真研究,还可作为新能源并网技术的教学与工程实践工具。; 适合人群:电气工程、自动化、新能源科学与工程等相关专业的高校本科生、研究生、科研人员,以及从事光伏发电系统设计、储能控制与并网技术研发的工程技术人员。; 使用场景及目标:①深入理解光伏储能系统中能量转换、存储与并网控制的整体工作原理;②支持课程设计、毕业设计或科研项目中对单相逆变器控制策略(如SPWM、PI调节、锁相技术等)的仿真验证与参数优化;③为后续研究更复杂的控制算法(如MPPT、低电压穿越、谐波抑制等)提供可扩展的仿真基础平台。; 阅读建议:建议结合MATLAB/Simulink环境动手搭建与调试模型,逐步理解各模块(如光伏建模、储能充放电控制、逆变器驱动、锁相环、PI调节器等)的功能与交互关系,重点关注控制系统的设计逻辑与参数整定过程,并可通过修改负载条件或电网参数测试系统鲁棒性,为进一步拓展至三相系统或多机并网场景奠定基础

111,131

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧