HttpWebRequest请求超时的错误

  从网上抓取点数据,其间要创建两个HttpWebRequest,第一个请求发送成功后,将服务端返回的Cookie记录下来给第二个HttpWebRequest使用.代码敲完了就执行吧,但请求到20次左右,总是会出现"请求超时"的错误,找了N久也没找到问题在哪里.

        开始,我以为是服务端限制了请求数量,于是,找了些代理IP,每个HttpWebRequest分配一个WebProxy,但是问题依然存在,于是我把Timeout属性改到5000ms,然后再Catch,在Catch中再设置一个失败的标识,Catch完后如果发现标识为失败,则继续发送请求,直到请求成功为止,执行了N长时间,还是在20次左右卡住了,程序一直在不停的try,catch,仍然没有往下继续的意思.

        没办法,网上搜了一下,没找到对应的数据,后来在园子里一个朋友不太相关的文章中找到了答案,一看,似乎以前就碰到过这个问题,唉,记性不好了,还是记下来吧,免得下次碰到又满世界的去找.

        其实没有什么大问题,问题就是我第一个HttpWebRequest在GetResponse之后,忘记将取得的WebResponse.Close掉.原来这个Close还负责释放资源啊...

        改改代码,加了一行代码,将WebResponse.Close掉后,一切恢复正常.

        (单线程的情况下,关闭掉WebResponse就可以了,多线程的情况下似乎要设置一下WebRequest.ServicePoint.ConnectionLimit属性)

       顺便记一下:HttpWebRequest有个AllowAutoRedirect,可以设置是否允许服务端Redirect,默认为true,特殊情况下需要设置为false.

参考网址:http://www.cnblogs.com/robot/archive/2009/06/10/1500085.html

在C#中,HttpWebRequest是用于发送HTTP请求的基础类。如果你想要设置超时重试次数,通常需要自定义一些逻辑来处理网络请求可能出现的超时错误。因为HttpWebRequest本身并没有直接提供自动重试的机制。 以下是简单的步骤: 1. 创建`HttpWebRequest`实例并设置基础超时时间: ```csharp HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://example.com"); request.Timeout = TimeSpan.FromSeconds(30); // 设置默认超时时间为30秒 ``` 2. 在发送请求之前,你可以封装这个操作,并添加一个循环结构,比如最多重试5次: ```csharp int retryCount = 0; while (retryCount < 5) { try { using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) { // 请求成功,处理响应 } break; // 如果没有异常,则跳出循环 } catch (WebException ex) { if (ex.Status == WebExceptionStatus.ConnectTimeout || ex.Status == WebExceptionStatus.ReadTimeout) { // 网络超时,增加重试次数 retryCount++; if (retryCount < 5) // 如果还有重试机会 continue; else { // 超过最大重试次数,抛出异常或记录日志 throw new AggregateException("所有重试都失败了", ex); } } else { throw; // 其他类型的异常直接抛出 } } } ``` 在这个例子中,如果遇到连接或读取超时,会增加一次重试,直到达到最大重试次数5次。当然,实际应用中你可能还需要根据具体需求调整其他细节,如判断是否应该等待一段时间再重试等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值