HTTPWebResponse + StreamReader非常慢

我正在尝试使用HttpWebResponse.GetResponse()和Streamreader.ReadToEnd()在C#中实现有限的Web爬虫(仅限几百个站点),也尝试使用StreamReader.Read()和循环来构建我的HTML字符串。

我只下载大约5-10K的页面。

一切都很慢! 例如,平均GetResponse()时间约为半秒,而平均StreamREader.ReadToEnd()时间约为5秒!

所有站点应该非常快,因为它们非常靠近我的位置,并且具有快速的服务器。 (在资源管理器中几乎没有任何东西到D / L),我没有使用任何代理。

我的Crawler有大约20个线程同时从同一站点读取。 这会导致问题吗?

如何减少StreamReader.ReadToEnd DRASTICALLY?

HttpWebRequest可能需要一段时间来检测您的代理设置 。 尝试将此添加到您的应用程序配置:

       

您还可以通过缓冲读取来减少对底层操作系统套接字的调用次数,从而获得轻微的性能提升:

 using (BufferedStream buffer = new BufferedStream(stream)) { using (StreamReader reader = new StreamReader(buffer)) { pageContent = reader.ReadToEnd(); } } 

WebClient的DownloadString是HttpWebRequest的一个简单包装器,您是否可以暂时尝试使用它并查看速度是否提高? 如果事情变得更快,你可以分享你的代码,以便我们可以看看它可能有什么问题吗?

编辑:

似乎HttpWebRequest遵守IE的“最大并发连接数”设置,这些URL是否在同一个域中? 您可以尝试增加连接限制以查看是否有帮助? 我发现这篇关于这个问题的文章 :

默认情况下,您不能执行超过2-3个异步HttpWebRequest(取决于操作系统)。 为了覆盖它(最简单的方法,恕我直言),不要忘记在应用程序的配置文件中的部分下添加:

      

我有同样的问题,但当我将HttpWebRequest的Proxy参数置于null时,它解决了问题。

 UriBuilder ub = new UriBuilder(url); HttpWebRequest request = (HttpWebRequest)WebRequest.Create( ub.Uri ); request.Proxy = null; HttpWebResponse response = (HttpWebResponse)request.GetResponse(); 

你试过ServicePointManager.maxConnections吗? 对于与此类似的事情,我通常会将其设置为200。

我有同样的问题,但最糟糕的问题。 response =(HttpWebResponse)webRequest.GetResponse(); 在我的代码中,在运行更多代码之前延迟了大约10秒,之后下载使我的连接饱和。

kurt的答案defaultProxy enabled =“false”

解决了这个问题。 现在响应几乎是即时的,我可以在我的连接最高速度下载任何http文件:)抱歉英语不好

我发现Application Config方法不起作用,但问题仍然是代理设置。 我的简单请求过去需要30秒,现在需要1秒。

 public string GetWebData() { string DestAddr = "http://mydestination.com"; System.Net.WebClient myWebClient = new System.Net.WebClient(); WebProxy myProxy = new WebProxy(); myProxy.IsBypassed(new Uri(DestAddr)); myWebClient.Proxy = myProxy; return myWebClient.DownloadString(DestAddr); } 

谢谢大家的答案,他们帮我挖掘了正确的方向。 我遇到了同样的性能问题,虽然提出改变应用程序配置文件的解决方案(因为我知道解决方案适用于Web应用程序)不符合我的需求,我的解决方案如下所示:

 HttpWebRequest webRequest; webRequest = (HttpWebRequest)System.Net.WebRequest.Create(fullUrl); webRequest.Method = WebRequestMethods.Http.Post; if (useDefaultProxy) { webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy; webRequest.Credentials = CredentialCache.DefaultCredentials; } else { System.Net.WebRequest.DefaultWebProxy = null; webRequest.Proxy = System.Net.WebRequest.DefaultWebProxy; } 

multithreading为什么不解决这个问题? multithreading将最小化网络等待时间,并且由于您将缓冲区的内容存储在系统内存(RAM)中,因此处理文件系统不会出现IO瓶颈。 因此,您的82页下载和解析需要82秒,应该花费15秒(假设处理器为4倍)。 如果我错过了什么,请纠正我。

____下载线_____ *

下载内容

forms流

阅读内容

_________________________ *