【问题标题】:HttpWebRequest takes a long time to send when there are a bunch at once from client当客户端一次有一堆时,HttpWebRequest 需要很长时间才能发送
【发布时间】:2010-09-01 07:06:09
【问题描述】:

我正在尝试使用创建许多 HttpWebRequest (1000+) 的 C# 负载测试客户端对 Comet-ish 服务器进行负载测试。我发现几分钟后,服务器随机接收一些请求需要很长时间。客户端认为它发送请求成功,但实际上需要 40s 才能到达服务器,此时为时已晚。 (因为这是一个 Comet 类型的服务器,服务器最终会丢弃客户端会话,这很糟糕)。我尝试从异步调用切换到同步调用,但没有任何区别。

问题一定出在客户端。我使用 Wireshark 进行了一些跟踪,结果发现该请求实际上需要 40 秒左右才能从客户端软件到达网络管道!当服务器在其管道上收到请求时,它会立即为该请求提供服务。

也许 C# 搞砸了,因为请求看起来与我之前发出的请求完全相同,并且出于某种奇怪的原因对其进行了缓存?我在回复中包含“Cache-Control:no-cache”以避免完全缓存。

【问题讨论】:

  • 失败请求的响应正文会写入什么内容?
  • 好点,我会检查...
  • 原来请求确实到达了,只是需要很长时间才能到达服务器,此时我的服务器写了一个响应,表明会话不再存在(正如预期的那样这些情况)。我更新了问题。
  • 我尝试将 AllowWriteStreamBuffering 设置为 false,但没有帮助。如:blogs.msdn.com/b/delay/archive/2009/09/08/…

标签: c# httpwebrequest


【解决方案1】:

我在第一次构建我的网络爬虫时遇到了类似的问题,它每分钟发出超过 2,000 个请求。问题是我并不总是及时处理HttpWebResponse 对象。当您以该速率发出请求时,垃圾收集/终结机制将无法跟上。

您是在执行同步请求还是异步请求并不重要。只要确保你总是打电话给response.Close()

【讨论】:

  • 我一直将它们全部包装在 using() 块中,我相信它应该调用 Close()?
  • @evilfred:是的,一个 using 块应该调用 Close(),尽管我注意到有时调用 Close() 会挂起,我不知道为什么。我发现调用 request.Abort() 然后调用 response.Close() 是最有效的。
  • 我会试试的。我正在使用另一个订单并认为它正在工作,但它不是:S
  • 不,它还在搞砸,啊。
  • 嗨,Jim,我打算执行类似的操作,我的客户端应用程序将在一分钟内执行近 2,000 个请求,只是为了检查网页是否更改。这是我在论坛上提出的原始问题。你能帮我吗? stackoverflow.com/questions/6239485/…
【解决方案2】:

您可能遇到了默认的客户端连接限制。默认情况下,它是两个连接,并且后面还有更多的队列。

要解决这个问题,请将其添加到您的 app.config 文件中:

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

用 maxconnection 进行实验,看看你的有效上限在哪里。

【讨论】:

  • 我已经在 ServicePointManager 上将它设置为 Int32.MaxValue
猜你喜欢
  • 1970-01-01
  • 2018-03-18
  • 2019-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多