日期:2014-05-16  浏览次数:20952 次

关于HttpWebRequest的问题,困扰我几个月了
我用HttpWebRequest访问网页,设置了代理,如果代理不可用的话,会卡20秒才返回.
即使设置以下两个方法分别为1秒,照样还是20秒才返回,
httpWebRequest.Timeout和httpWebRequest.ReadWriteTimeout两个方法;
有点浪费时间,困扰很久了,一设置代理,这两个方法直接就失效了,
另外异步不行的,不能设置Keep-Alive.
不知道各路大侠有没有什么方法能解决此问题的,实在不行推荐款其他插件也行啊,
谢谢各位大大.
------解决方案--------------------
 request.Proxy = null;  //Skip auto proxy detect
------解决方案--------------------
引用:
Quote: 引用:

试试.net 4.5的HttpClient呢?

亲,貌似4.5没有HttpClient这个类,只有WebClient,而且WebClient没有设置超时的方法的
namespace System.Net.Http
{
    // Summary:
    //     Provides a base class for sending HTTP requests and receiving HTTP responses
    //     from a resource identified by a URI.
    public class HttpClient
------解决方案--------------------
代理的不稳定性是很难预判的,至少我还没有找到很好的办法,往往尝试连接代理服务器会花费很长的时间.
如果是想快速响应,并跳过无效代理,可以使用线程,通过ManualResetEvent的Wait方法阻塞等待,判断超时.如果超时,可以切换别的代理.当然,这个等待超时时间可以包括连接+等待回复的时间.
我的处理方式是建立一个大的代理服务器地址列表, 给每个代理服务器地址分配一个权重. 每次取随机数*权重,排序,用值最大的代理服务器地址.
权重的初始值是一样的, 再通过成功连接数,失败连接数,平均连接花费时间等,动态调整权重.
------解决方案--------------------
引用:
... ...
谢谢这位大大的思路,我现在用HttpClient已经可以准确设置超时了,并且是4.0环境,现在遇到的问题是,1,2个线程没问题,开多了线程,比如说600线程,直接就报异常,一个网页都不能正常访问,貌似这HttpClient不能太多线程,怎么破


首先, 你得告诉我们, 报的是什么异常.
第二, 系统支持多线程, 但你开那么多, 其实没有太多好处了, 用于建立线程的开销, 线程间切换的开销也是很大的. 一般, 不建议创建超过CPU核心线程数*2个.(你的U是4核8线程的, 那么, 不建议建立超过8个进程线程.)
第三, 是不是使用了代理,
第四, 要控制对同一个域的访问周期, 比如两个请求之间没有间隔, 有的域, 会做限制, 直接封掉你的IP或者什么. 这个也要小心处理. 使用代理也一样, 一个代理的频率太高, 这个代理也会被封.