HttpWebRequest非常慢!

时间:2010-03-25 21:49:02

标签: c# performance http httpwebrequest

我正在使用开源库连接到我的网络服务器。我担心网络服务器的速度非常慢,然后我尝试用Ruby做一个简单的测试,我得到了这些结果

  

Ruby程序:10个HTTP的2.11秒   可获得

     

Ruby程序:100 HTTP的18.13秒   可获得

     

C#库:10个HTTP的20.81秒   可获得

     

C#library:100 HTTP的36847.46seconds   可获得

我已经分析并发现问题是这个功能:

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上进行所有这些测试,因此网络带宽不是问题。

导致这种巨大减速的原因是什么?

更新

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

13 个答案:

答案 0 :(得分:168)

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

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

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

答案 1 :(得分:20)

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

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

答案 2 :(得分:10)

我在VB.Net MVC项目中遇到了类似的问题 在我的电脑上本地(Windows 7),它只需要1秒钟就可以点击页面请求,但在服务器(Windows Server 2008 R2)上,每个页面请求需要20秒以上。

我尝试了将代理设置为null

的组合
  System.Net.WebRequest.DefaultWebProxy = Nothing
  request.Proxy = System.Net.WebRequest.DefaultWebProxy

通过添加

更改配置文件
 <system.net>
   .......
   <connectionManagement>
     <add address="*" maxconnection="20"/>
   </connectionManagement>
 </system.net>

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

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

答案 3 :(得分:7)

我开始在这个区域观察类似于OP的减速,当增加MaxConnections时,它会有所改善。

ServicePointManager.DefaultConnectionLimit = 4;

但是在构建了这么多WebRequest之后,延迟又回来了。

在我的情况下,问题在于我正在调用POST而不是对响应感到困扰,因此没有采取或做任何事情。不幸的是,这让WebRequest浮动,直到它们超时。

解决方法是拿起响应并关闭它。

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();

答案 4 :(得分:3)

使用 localhost 以外的计算机,然后使用WireShark查看通过网络传输的内容。

像其他人所说的那样,它可以是很多东西。在TCP级别上查看事物应该给出清晰的图像。

答案 5 :(得分:3)

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

System.Net.ServicePointManager.Expect100Continue = false;

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

答案 6 :(得分:1)

我知道这是一个旧线程,但我已经用慢速HttpWebRequest丢失了一整天,尝试了所有提供的解决方案而没有运气。每个地址的请求都超过一分钟。

最终,问题出现在我的防病毒防火墙(Eset)上。我使用防火墙和交互模式,但 Eset以某种方式完全关闭。这导致请求永远持续下去。在打开Eset 并执行请求后,会显示提示防火墙消息,确认后,请求执行不到一秒

答案 7 :(得分:0)

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

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

我的解决方案: 注释掉与cookie相关的代码和bam!电话花了不到一秒钟。

答案 8 :(得分:0)

这对我有用:

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

现金: https://social.msdn.microsoft.com/Forums/en-US/14844bfe-ad5b-4e5a-b6ef-4ff9a1a770f8/slow-httpwebrequest-the-first-time-the-program-starts?forum=ncl

答案 9 :(得分:0)

对我来说,问题是我安装了LogMeIn Hamachi - 具有讽刺意味的是远程调试同一个程序,然后开始展现这种极端缓慢。

仅供参考,禁用Hamachi网络适配器是不够的,因为它的Windows服务似乎重新启用了适配器。

此外,重新连接到我的Hamachi网络并没有解决问题。只禁用适配器(通过禁用LogMeIn Hamachi Windows服务)或者可能卸载Hamachi,解决了我的问题。

是否可以要求logger.warning("SKIPPED File: '%s'; " \ "MyFunc() returned no results." % (dir_file, )) 通过特定的网络适配器?

答案 10 :(得分:0)

对我来说,使用HttpWebRequest来平均本地调用API的时间为40毫秒,而使用服务器上的API的平均调用时间为270ms。但是在两种环境下,通过Postman呼叫它们的平均时间为40ms。此线程中的解决方案都对我没有任何影响。

然后我发现this article提到了Nagle算法:

Nagle算法通过减少跨网络发送的数据包数量来提高网络效率。它通过在将少量数据写入网络时在客户端上设置长达200毫秒的延迟来完成此操作。延迟是可能要写入其他数据的等待时间。新数据将添加到同一数据包中。

ServicePoint.UseNagleAlgorithm设置为false是我所需要的魔术,它产生了巨大的变化,并且服务器上的性能现在几乎与本地性能相同。

var webRequest = (HttpWebRequest)WebRequest.Create(url);
webRequest.Method = "POST";
webRequest.ServicePoint.Expect100Continue = false;
webRequest.ServicePoint.UseNagleAlgorithm = false; // <<<this is the important bit

请注意,这对我来说只处理少量数据,但是,如果您的请求涉及大数据,则可能有必要根据请求的大小/响应的预期大小将此条件设为条件标记。

答案 11 :(得分:0)

对于我来说,在代码中添加AspxAutoDetectCookieSupport=1,问题就解决了

Uri target = new Uri("http://payroll");

string responseContent;
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(target);

request.CookieContainer = new CookieContainer();         
request.CookieContainer.Add(new Cookie("AspxAutoDetectCookieSupport", "1") { Domain = target.Host });

using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
{
    using (Stream responseStream = response.GetResponseStream())
    {
        using (StreamReader sr = new StreamReader(responseStream))
            responseContent = sr.ReadToEnd();
    }
}

答案 12 :(得分:-1)

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