我在c#中编写了一个用于抓取网站的多线程程序,但是当我在后台启动Fiddler请求的速度提高了12倍时,对我来说真的很奇怪,当我关闭Fiddler时,下载速度会降低。怎么可能请帮助,(我的连接到ineternet和Fiddler没有代理设置)如果我可以在我的应用程序中注入fiddler的性能,那将是非常好的,任何解决方案?幕后有什么魔力? :)
由于
答案 0 :(得分:25)
原因是使用Fiddler时忽略的http连接数限制。
使用System.Net.Http.HttpClient
执行多个(~80)并发请求时遇到了相同的行为。随着Fiddler的运行,所有请求都完成得更快。保持活力当然是有效的。
我使用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确实充当代理时,结果限制是不同的。除了this old article之外,我没有找到有关代理连接限制的更多信息。
答案 1 :(得分:11)
你能展示一些示例代码,以便人们可以确认吗?否则它会变得疯狂猜测。
我最好的猜测:Fiddler uses keepalive可以省去一遍又一遍打开连接的麻烦。您可以通过禁用Reuse client connections
和Reuse connections to servers
来确认这一点:如果它然后像往常一样慢(或更慢),则可以通过保持连接活动来获益。