WebClient、HttpWebRequest 和 HttpClient 的最大并发请求数

17

在.NET 4.5中,使用WebClient、HttpWebRequest和HttpClient类发送并发/并行请求时,是否存在任何限制?或者如果Web API或服务器没有限制,您是否可以无限制地发送并行请求?

如果我的问题太宽泛,请指出来,以便我可以缩小范围。

1个回答

27

是的,有连接限制。每个远程主机的默认并发连接限制为2个。这可以被覆盖。例如,我相信ASP.NET默认将默认值覆盖为每个远程主机10个连接。

根据https://msdn.microsoft.com/en-us/library/7af54za5.aspx

客户端和服务器之间的连接数量对应用程序吞吐量有着显著影响。默认情况下,使用HttpWebRequest类的应用程序最多使用两个持久连接到给定的服务器,但您可以按应用程序基础设置最大连接数。

要更改连接限制,请使用ServicePointManager.DefaultConnectionLimit。确保在进程启动后不久进行此更改,在连接到远程主机之前。这是因为一旦您实际上与远程主机建立HTTP连接,那么将使用当前默认连接限制为该远程主机创建一个ServicePoint

请注意,除了HTTP客户端类强制执行的限制之外,还存在其他有效的并发连接限制。例如,如果您想打开一百万个并发连接,您可能会耗尽RAM、线程或其他操作系统资源。如果您遇到这些限制,那么您需要提出另一个更普遍的问题,询问如何扩展.NET进程以处理大量并发I/O。但是,如果您只打开几十个连接,则应该没问题。

顺带一提,如果你好奇为什么默认限制这么低,那实际上是因为它融入了HTTP规范——目的是确保自私的HTTP客户端不会通过同时连接来淹没HTTP服务器。虽然现代浏览器忽略了这个规范。有关此主题的详细信息,请参见http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/,其中包含比您想要了解的更多细节!


1
我们如何在 .net core 中配置这个?ServicePointManager 已经不再是一个东西了。 - Douglas Gaskell
{btsdaf} - cbp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接