WebRequest.GetRequestStream 超时不起作用

问题描述

本人有段WebRequest使用HTTP/HTTPS代理请求页面的代码,代码已经做了超时设置,对使用大部分带来请求数据的时候超时设置都起作用,但是在使用很少部分HTTPS代理的时候,超时设置根本不请任何作用,WebRequest.GetRequestStream无限等待,不知道为什么会出现这种情况。请大家帮下忙stringhtmlResult="";try{ServicePointManager.Expect100Continue=false;HttpWebRequestrequest=null;if(strURL.StartsWith("https",StringComparison.OrdinalIgnoreCase)){ServicePointManager.ServerCertificateValidationCallback=newRemoteCertificateValidationCallback(CheckValidationResult);request=WebRequest.Create(strURL)asHttpWebRequest;}else{request=WebRequest.Create(strURL)asHttpWebRequest;}request.MaximumAutomaticRedirections=5;request.Timeout=maxReadMs;request.ReadWriteTimeout=maxReadMs;request.AllowAutoRedirect=redirect302;if(proxy!=null&&!string.IsNullOrEmpty(proxy.Host)){request.Proxy=newWebProxy(proxy.Host,proxy.Port);request.Timeout=0x1770;}request.Method=getOrPost;request.Referer=referer;request.ContentType="application/x-www-form-urlencoded";request.UserAgent="Mozilla/5.0(compatible;MSIE9.0;WindowsNT6.1;Trident/5.0)";request.Accept="text/html,application/xhtml+xml,*/*";if(usegzip)request.Headers.Add(HttpRequestHeader.AcceptEncoding,"gzip,deflate");if(!string.IsNullOrEmpty(appendHttpHeads)){appendHttpHeads+="rn";MatchCollectionheads=newRegex(".*?rn").Matches(appendHttpHeads);foreach(Matchheadinheads){if(!string.IsNullOrEmpty(head.Value.Trim()))request.Headers.Add(head.Value.Trim());}}if(cookie!=null){request.CookieContainer=newCookieContainer();request.CookieContainer.Add(cookie.ToCookieCollection());}try{if(!string.IsNullOrEmpty(postData)){byte[]data=Encoding.UTF8.GetBytes(postData);request.ContentLength=data.Length;using(Streamstream=request.GetRequestStream()){stream.Write(data,0,data.Length);}}using(WebResponseresponse=(HttpWebResponse)request.GetResponse()){Streamstream=response.GetResponseStream();if(response.Headers[HttpResponseHeader.ContentEncoding]!=null&&response.Headers[HttpResponseHeader.ContentEncoding].ToLower().Contains("gzip"))stream=newGZipStream(stream,CompressionMode.Decompress);elseif(response.Headers[HttpResponseHeader.ContentEncoding]!=null&&response.Headers[HttpResponseHeader.ContentEncoding].ToLower().Contains("deflate"))stream=newDeflateStream(stream,CompressionMode.Decompress);stringcharset="";if(!string.IsNullOrEmpty(response.ContentType)){if(newRegex("charset=",RegexOptions.IgnoreCase).IsMatch(response.ContentType))charset=newRegex("charset=.*?[;|]",RegexOptions.IgnoreCase).Match(response.ContentType+"").Value.Split('=')[1].Trim().Trim(';');}if(string.IsNullOrEmpty(charset))charset="utf-8";StreamReaderreader=newStreamReader(stream,Encoding.GetEncoding(charset));htmlResult=reader.ReadToEnd();strURL=response.ResponseUri.ToString();referer=strURL;stringcookiesHeaders=response.Headers[HttpResponseHeader.SetCookie];if(!string.IsNullOrEmpty(cookiesHeaders))cookie.Add(cookiesHeaders,response.ResponseUri.Host);reader.Close();reader.Dispose();stream.Dispose();}}catch(WebExceptione){using(WebResponseresponse=e.Response){if(response!=null){HttpWebResponsehttpResponse=(HttpWebResponse)response;switch(httpResponse.StatusCode){caseHttpStatusCode.RequestTimeout:break;default:break;}}}}}catch{}returnhtmlResult;

解决方案

解决方案二:
请求的数据编码是什么?要和发送的request.ContentType="application/x-www-form-urlencoded";编码一致
解决方案三:
和编码没关系多线程调用不同代理访问同一个页面大部分代理都正常,但遇到极少数代理的时候GetRequestStream就无限超时
解决方案四:
加个判断。超过多长时间然后在次请求下。
解决方案五:
现在是超时设置没用超时时间直接默认成五分钟了,所以有些线程就要等五分钟才抛出异常,这样线程很容易卡死
解决方案六:
就是明明设置了超时时间但调用特定代理访问页面的时候超时时间直接默认成五分钟了,不知道咋回事

时间: 2024-10-02 00:46:34

WebRequest.GetRequestStream 超时不起作用的相关文章

HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法

原文:HttpWebRequest的GetResponse或GetRequestStream偶尔超时 + 总结各种超时死掉的可能和相应的解决办法     [问题] 用C#模拟网页登陆,其中去请求几个页面,会发起对应的http的请求request,其中keepAlive设置为true,提交请求后,然后会有对应的response: resp = (HttpWebResponse)req.GetResponse(); 之前的多次调试,一直都是可以正常获得对应的response,然后读取html页面的.

urlConnection的超时设置怎么样才能起作用

问题描述 使用urlConnection,但设置连接超时和读超时不起作用,请问怎样才能起作用? 解决方案 解决方案二:setConnectionTimeout和setReadTimeout不起作用么?connectTimeout表示在指定的时间内还没有连上主机就会触发一个java.net.SocketTimeoutException异常readTimeout指的是在请求数据之后若在指定的时间内没有数据读回来,那会触发一个java.net.SocketTimeoutException异常你的应用环

RegionServer异常超时检测

现象 将主机网线拔掉后,RegionServer过一段时间会shutdown掉,RegionServer的异常超时检测机制是由哪个参数控制的呢? Regionsever异常shutdown日志: 2017-08-03 21:17:42,762 WARN [main-SendThread(OCSCloud07:9501)]zookeeper.ClientCnxn: Session 0x25ce22897746d12 for serverOCSCloud07/134.32.62.7:9501, un

c#-C#使用webRequest调用webservice的问题

问题描述 C#使用webRequest调用webservice的问题 Uri uri = new Uri(url); WebRequest webRequest = WebRequest.Create(uri); webRequest.ContentType = "text/xml;charset=utf-8"; webRequest.Method = "POST"; using (Stream requestStream = webRequest.GetReque

Spring事务超时时间可能存在的错误认识

1.先看代码 1.1.spring-config.xml Java代码   <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">       <property name="driverClassName" value="com.mysql.jdbc.Driver"/>    

zookeeper的maxSessionTimeout默认值导致hbase regionserver超时

zookeeper的maxSessionTimeout默认值导致hbase regionserver超时 在hbase中经常会遇到regionserver挂掉的情况,查看日志会看到这样的错误信息 2016-02-16 11:51:24,882 WARN  [master/hadoop02/192.168.100.5:6000] zookeeper.ZKUtil: master:6000-0x3525df55101a556, quorum=hadoop02:2181,hadoop03:2181,h

请大神给提供个解决思路,关于模拟登录的问题!

问题描述 我先来介绍一下项目:首先要一台服务器有2个IP地址IP1=133.XXX.XXX.XXXIP2=192.XXX.XXX.XXX其中133段为内网段,公司内部都使用这个网络,IP2为一条内部专线,专门负责联系一套管理系统.这套管理系统只能通过IP2来访问,但是只有这一台机器拥有这条线路,并且不允许扩展.IP2的管理系统是需要通过公司派发的统一帐号登录才可以操作,如帐号user,密码user,还包括一个验证码.那么问题来了!问题就是统一派发的帐号只有一个,也就是说如果让IP1段的所有用户都

一个发送xml远程请求和接收xml请求结果并置入DataSet的方法

xml|请求 /// <summary>  /// 返回查询结果  /// </summary>  /// <param name="RequestString">请求的字符串</param>  /// <param name="WriteText">是否打印出表格</param>  /// <returns></returns>  public static Syste

C#身份证识别相关技术

原文:C#身份证识别相关技术 最近研究C#相关的OCR技术,图像识别一般C和C++这种底层语言做的比较多,C#主要是依托一些封装好的组件进行调用,这里介绍三种身份证识别的方法. 一:调用大公司API接口,百度.云脉,文通科技都有相关的API介绍. 二:调用图像处理类库,EmguCV是OpenCV的一个跨平台的.Net封装,该封装也可以被编译到Mono平台和允许在Windows.Mac OS.Android.iPhone.iPad等多个平台上运行 三:调用Office2007 组件 一.证件识别A