HttpWebRequest是非常慢!

我正在使用一个开源库连接到我的networking服务器。 我担心networking服务器变得非常慢,然后我尝试在Ruby中做一个简单的testing,并得到了这些结果

Ruby程序:10个HTTP GET的2.11秒

Ruby程序:对于100个HTTP GET,18.13秒

C#库:10个HTTP GET 20.81秒

C#库:100个HTTP GET的36847.46秒

我已经分析,发现问题是这个function:

private HttpWebResponse GetRawResponse(HttpWebRequest request) { HttpWebResponse raw = null; try { raw = (HttpWebResponse)request.GetResponse(); //This line! } catch (WebException ex) { if (ex.Response is HttpWebResponse) { raw = ex.Response as HttpWebResponse; } } return raw; } 

标记的线需要1秒钟才能完成,而发出1个请求的ruby程序需要0.3秒。 我也在127.0.0.1上进行所有这些testing,所以networking带宽不是问题。

什么可能导致这个巨大的减速?

UPDATE

查看更改的基准testing结果。 我实际上testing了10个GET而不是100个,我更新了结果。

我发现,缓慢的Web请求的主要罪魁祸首是代理属性。 如果在调用GetResponse方法之前将此属性设置为null,则查询将跳过代理自动检测步骤:

 request.Proxy = null; using (var response = (HttpWebResponse)request.GetResponse()) { } 

在返回响应之前,代理自动检测最多需要7秒才能进行查询。 HttpWebRequest对象默认为这个属性设置是有点烦人的。

这可能与您一次打开几个连接的事实有关。 默认情况下,打开的HTTP连接的最大数量设置为2。 尝试添加到您的.config文件,看看是否有帮助:

 <system.net> ....... <connectionManagement> <add address="*" maxconnection="20"/> </connectionManagement> </system.net> 

我有一个VB.Net MVC项目类似的问题。
在我的电脑上(Windows 7),它需要1秒钟的时间才能打到页面请求,但在服务器(Windows Server 2008 R2)上,每个页面请求需要20多秒的时间。

我尝试了将代理设置为null的组合

  System.Net.WebRequest.DefaultWebProxy = Nothing request.Proxy = System.Net.WebRequest.DefaultWebProxy 

并通过添加更改configuration文件

  <system.net> ....... <connectionManagement> <add address="*" maxconnection="20"/> </connectionManagement> </system.net> 

这仍然没有减less在服务器上的缓慢的页面请求时间。 最后,解决scheme是取消选中服务器本身的IE选项中的“自动检测设置”选项。 (在“工具” – >“Internet选项”下,select“连接”选项卡,按“局域网设置”button)

在服务器上取消选中此浏览器选项后,立即将所有页面请求时间从20秒以上降低到1秒以下。

我开始观察到这个区域的减速类似于OP,这个区域在增加MaxConnections时稍微好一些。

 ServicePointManager.DefaultConnectionLimit = 4; 

但是在build立这个WebRequests之后,这个延迟又回来了。

在我的情况下,问题是我打电话给POST,而不是打扰了回应,所以没有采取任何措施。 不幸的是,这使WebRequest一直处于浮动状态,直到超时。

解决办法是拿起响应,并closures它。

 WebRequest webRequest = WebRequest.Create(sURL); webRequest.Method = "POST"; webRequest.ContentLength = byteDataGZ.Length; webRequest.Proxy = null; using (var requestStream = webRequest.GetRequestStream()) { requestStream.WriteTimeout = 500; requestStream.Write(byteDataGZ, 0, byteDataGZ.Length); requestStream.Close(); } // Get the response so that we don't leave this request hanging around WebResponse response = webRequest.GetResponse(); response.Close(); 

使用本地主机以外的其他计算机,然后使用WireShark查看线路上的真实情况。

像其他人所说的那样,这可能是一些事情。 看待TCP层面的事情应该给出一个清晰的图景。

我不知道如何达到这个解决方法,我没有时间做一些研究,所以这取决于你们。 有一个参数,我用它(在我的类的构造函数,实例化HTTPWebRequest对象之前):

 System.Net.ServicePointManager.Expect100Continue = false; 

我不知道为什么,但现在我的电话看起来相当快。

我尝试了所有这里描述的解决scheme,没有运气,电话花了大约5分钟。

什么问题:我需要相同的会话,显然是相同的cookie(请求在同一台服务器上),所以我从Request.Cookies重新创buildcookie到WebRequest.CookieContainer 。 响应时间约为5分钟。

我的解决scheme: 注释掉与cookie相关的代码和bam! 通话时间不到一秒钟。

这对我工作:

 <configuration> <system.net> <defaultProxy erabled="false"/> </system.net> </configuration> 

积分: https : //social.msdn.microsoft.com/Forums/zh-CN/14844bfe-ad5b-4e5a-b6ef-4ff9a1a770f8/slow-httpwebrequest-the-first-time-the-program-starts? forum =ncl

我知道这是一些旧的线程,但我一整天慢吞吞HttpWebRequest,尝试每一个提供的解决scheme,没有运气。 每个地址的请求都超过一分钟。

最终, 问题出在我的防病毒防火墙(Eset)上 。 我使用交互模式的防火墙,但Eset完全closures 。 这导致请求永远持续下去。 打开Eset后 ,执行请求,显示提示防火墙消息,确认后, 请求执行时间less于1秒

我们在networking应用上遇到了同样的问题。 我们等了5秒钟。 当我们将用户在IIS上的applicationPool上更改为networkService时,响应开始到达不到1秒