C# HttpWebRequest GetRequestStream没反应超时解决办法
前几天写的一个winform程序启动多线程调用HttpWebRequest POST请求远程网址验证数据,在window2003系统下运行没有问题,但是放到window2008系统或者window7下面运行的时候,出现了操作超时的问题,或者验证数据返回很慢,网速绝对没有问题的,同一台电脑,系统为window2003,然后通过vmware虚拟机安装了window2008和window7系统运行编写的软件。给朋友测试即使不是虚拟机安装的系统,也会出现超时请求或者返回数据很慢的问题。window2003系统则不存在这个问题。
后面在vmware安装的window7下安装visual C# express调试跟踪发现运行到ioStream = request.GetRequestStream()获取响应流以便写入数据的时候发现半天没反应,然后等了1分多钟后就出现了超时错误。
按照网上找的方法,关闭请求对象,响应对象,设置 ServicePointManager.DefaultConnectionLimit ,但是在window2008和window7下都会出现超时问题,window2003下就是好好的。
response.Close(); request.Abort(); response = null; request = null;
ServicePointManager.DefaultConnectionLimit 默认为2,如果没有使用上面的代码释放请求连接,那么当前的Http的connection用完了,后续的GetResponse或GetRequestStream会超时死掉。
ServicePointManager.DefaultConnectionLimit =1000;//默认为2
但是设置ServicePointManager.DefaultConnectionLimit =1000;还是没解决这个问题,还是运行到ioStream = request.GetRequestStream()这句就假死没有反应直到抛出超时错误。
后面注意到请求的url是https加密协议的,不是普通的http请求,难道是这个问题。于是修改为请求普通的http页面测试,我靠( ‵o′)凸。。不再报超时错误了。看来请求https加密协议页面HttpWebRequest需要做一些额外的配置。
按照网上找到的,在请求前按照如下设置,就不会出现超时错误了。但为毛window2003不设置也没问题,window2008或者window7会有这个问题,搞不懂。。
using System; using System.Collections.Generic; using System.Text; using LiuLiangKa.Model; using System.Net; using System.Net.Security; using System.Security.Cryptography.X509Certificates; using System.IO; namespace LiuLiangKa.Tool { public class HttpSend { /// <summary> /// ssl验证 /// </summary> /// <param name="sender"></param> /// <param name="certificate"></param> /// <param name="chain"></param> /// <param name="errors"></param> /// <returns></returns> public static bool SecurityValidate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors) { //直接确认,不然打不开,会出现超时错误 return true; } /// <summary> /// 发送http请求查询 /// </summary> /// <param name="card">流量卡实例</param> /// <returns></returns> public static AjaxResult Send(Card card) { AjaxResult r; try { Encoding utf8 = Encoding.UTF8; string postStr; byte[] postBin; HttpWebRequest request; HttpWebResponse response; Stream ioStream; #region Post ///////////////////////https设置 ServicePointManager.DefaultConnectionLimit = 1000; ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3;//2013-08-23在window7下测试,只需要增加这个配置请求https就不会超时,下面这句省略也行。 ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(SecurityValidate);//这个不需要也行,只需要设置ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3; /////////////////////// postStr = card.ToString(); postBin = utf8.GetBytes(postStr); request = WebRequest.Create("https://xxxxxxx") as HttpWebRequest;///////////////////////https不设置SecurityProtocol和ServerCertificateValidationCallback会在request.GetRequestStream()这步超时 //request = WebRequest.Create("http://xxxxx/json.asp") as HttpWebRequest;//非http不会出现超时错误 request.Referer = "https://xxxxxxxx"; request.Method = "post"; request.KeepAlive = false; request.AllowAutoRedirect = false;//不允许重定向 request.ContentType = "application/x-www-form-urlencoded"; request.ContentLength = postBin.Length; ioStream = request.GetRequestStream(); ioStream.Write(postBin, 0, postBin.Length); ioStream.Flush(); ioStream.Close(); response = request.GetResponse() as HttpWebResponse; ioStream = response.GetResponseStream(); StreamReader sr = new StreamReader(ioStream, utf8); r = JSONToInstance.GetClassInstance(sr.ReadToEnd()); sr.Close(); ioStream.Close(); response.Close(); request.Abort(); response = null; request = null; #endregion } catch (Exception ex) { r = new AjaxResultError(); r.ty = "-1"; r.voucher_pin = card.pin; ((AjaxResultError)r).errorMsg = ex.Message; } return r; } } }
加支付宝好友偷能量挖...
原创文章,转载请注明出处:C# HttpWebRequest GetRequestStream没反应超时解决办法