我用 C# 编写了一个爬取网站的多线程程序,但是当我在后台启动 Fiddler 时,请求完成的速度提高了 12 倍,这对我来说真的很奇怪,当我关闭 Fiddler 时下载速度会变慢。怎么可能,请帮忙,(我的互联网连接和提琴手也没有代理设置)如果我可以在我的应用程序中注入提琴手的性能,那就太好了,有什么解决方案吗?幕后有什么魔力吗??:)
谢谢
我用 C# 编写了一个爬取网站的多线程程序,但是当我在后台启动 Fiddler 时,请求完成的速度提高了 12 倍,这对我来说真的很奇怪,当我关闭 Fiddler 时下载速度会变慢。怎么可能,请帮忙,(我的互联网连接和提琴手也没有代理设置)如果我可以在我的应用程序中注入提琴手的性能,那就太好了,有什么解决方案吗?幕后有什么魔力吗??:)
谢谢
原因是使用 Fiddler 时忽略的同时 http 连接数的限制。
我在使用System.Net.Http.HttpClient
执行多个(〜80)并发请求时遇到了相同的行为。随着 Fiddler 的运行,所有请求的完成速度都快得多。Keep-alive 肯定是启用的。
我使用 Wireshark 查看发生了什么,我首先注意到 http 流量的方式不同。使用 Fiddler 请求被一次性抛出,响应也被很好地分组。如果没有 Fiddler,请求就会与响应交错。
其次,tcpview 显示我没有 Fiddler 的代码只打开了 2 个到服务器的 tcp 连接。随着 Fiddler 的启动,连接数显着增加。从我的应用程序到 Fiddler,然后从 Fiddler 到服务器,有几十个。
众所周知,http 标准建议 http 连接数不应超过 2,并且该限制似乎是 http 客户端中的默认设置。
在 .NET 应用程序中,我们可以使用ServicePointManager.DefaultConnectionLimit
静态属性控制限制。作为一项实验,将其设置为 100 会使请求在有和没有 Fiddler 的情况下同时完成。
该设置也可以通过 app.config 进行控制:
<system.net>
<connectionManagement>
<add address="*" maxconnection="100" />
</connectionManagement>
</system.net>
现在,为什么在使用 Fiddler 时不遵守默认连接限制?当 http 客户端使用代理并且 Fiddler 确实充当代理时,限制看起来是不同的。除了这篇旧文章,我没有找到太多关于代理连接限制的信息。
您能否展示一些示例代码以便人们确认这一点?否则会变成胡思乱想。
我最好的猜测:Fiddler使用 keepalive,这样可以省去一遍又一遍地打开连接的麻烦。Reuse client connections
您可以通过禁用和来确认这一点Reuse connections to servers
:如果它像往常一样慢(或更慢),则可以通过保持连接活动来获得好处。