10

我在使用 HttpWebRequest 时遇到了一些非常奇怪的行为,希望有人可以帮助我。我有一个控制台应用程序,它通过使用 HttpWebRequest 对象来检索目标网站的内容来完成一些聚合工作。由于要求的性质,该应用程序是多线程的,并尝试建立 10 到 30 个同时连接(我一直在尝试一系列值)。实际的网络请求结构如下:

var req = (HttpWebRequest)WebRequest.Create(url);
WebResponse resp = req.GetResponse();
Stream s = resp.GetResponseStream();
var sr = new StreamReader(s, Encoding.ASCII);
string doc = sr.ReadToEnd();
sr.Close();
resp.Close();
return doc;

无论如何,奇怪的行为是,在正常情况下,应用程序每分钟可以实现大约 120 个请求,但如果我打开 Fiddler,它会跳到大约 600 个。使用 Windows 7 资源监视器,我可以看到网络活动相应增加。控制台进程的 TCP 连接现在将远程地址列为“IPv4 环回”,而不是目标服务器 IP 地址(预期)。我确实想知道机器允许的同时 HTTP 请求的最大数量,但在注册表中更改它似乎并没有什么不同。

所以问题是;运行 Fiddler 是怎么回事,它突然将吞吐量提高了五倍,我怎样才能在机器上本地实现这一点而无需启动另一个工具?

谢谢!

4

7 回答 7

14

看起来我现在已经能够通过在 App.config 中设置最大连接数来提高吞吐量(实际上是打开 Fiddler 时得到的两倍):

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

对结果非常满意,但对于为什么打开 Fiddler 会如此显着地改变结果,我仍然有些困惑。

于 2009-06-21T02:18:36.250 回答
5

我立即注意到的一件事是您没有使用块来实现。这增加了一个随机因素,可能会乘以请求的数量,所以我建议你解决这个问题:

var req = WebRequest.Create(url);
using (WebResponse resp = req.GetResponse())
{
    using (Stream s = resp.GetResponseStream())
    {
        using (var sr = new StreamReader(s, Encoding.ASCII))
        {
            return sr.ReadToEnd();
        }
    }
}

接下来,仅供参考,Fiddler 充当代理。如果您的默认代理设置为使用脚本来设置代理配置,那么我想知道运行 Fiddler 是否可能不会消除执行脚本设置所需的时间。这可能只发生一次,而不是在每个请求上发生。

于 2009-06-21T00:26:10.483 回答
1

我遇到了与您类似的问题,并想分享我的解决方案。

简而言之,我有一个控制台程序正在发出 HTTP 请求,并且会在 15 分钟左右后超时。但是,如果我使用 Fiddler,那么即使在连续运行了几天之后,我也从未遇到过超时。

我尝试在 App.config 中设置 maxconnections 属性,但这似乎根本没有帮助。然后,我进入了对 HttpWebRequest、HttpWebResponse 和用于在 using 块中读取/写入这些对象的数据的流对象的每一个引用。

似乎成功了。我已经运行了将近 24 小时,没有超时,也没有运行 Fiddler。

于 2009-10-23T20:04:40.793 回答
0

您查询的方式会导致为每个调用创建一个新会话,这是开销,可能是提琴手将会话添加到您的查询中......

尝试

私有静态 CookieContainer _cookieContainer = new CookieContainer();

_httpWebRequest.CookieContainer = _cookieContainer; //回收cookie容器

于 2010-03-30T08:04:34.110 回答
0

我们遇到了同样的问题,将您的 httpWebRequest.PreAuthenticate 设置为 true。

你不应该再有 401 响应,所以你会打开更少的连接......

于 2011-04-22T13:25:14.737 回答
0

我有同样的问题。我下载了这个: http ://www.wowinterface.com/downloads/info13581-LeatrixLatencyFix.html 这是HttpWebRequest性能的原因。它修改了 TCPAckFrequency 并完全搞砸了一切。我删除了它,现在它可以工作了。

于 2011-12-09T17:56:41.580 回答
0

对我来说,我正在设置request.ProtocolVersion = HttpVersion.Version10;

默认设置为 HttpVersion.Version11。当我将其设置回默认值时,我的请求在没有提琴手的情况下变得更快。

我希望这对其他人有帮助,我花了整个上午才弄清楚这一点!

于 2013-03-27T18:42:15.197 回答