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

Posted

技术标签:

【中文标题】WebClient、HttpWebRequest 和 HttpClient 的最大并发请求数【英文标题】:Maximum concurrent requests for WebClient, HttpWebRequest, and HttpClient 【发布时间】:2016-09-15 17:00:13 【问题描述】:

使用 .NET 4.5 中的 WebClient、HttpWebRequest 和 HttpClient 类可以发送多少并发/并行请求有任何限制吗?或者,如果对 Web API 或服务器没有限制,您是否可以发送无限的并行请求? 抱歉,如果问题太宽泛,请纠正我,以便我缩小范围。

【问题讨论】:

【参考方案1】:

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

来自https://msdn.microsoft.com/en-us/library/7af54za5.aspx:

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

要自己更改连接限制,请使用ServicePointManager.DefaultConnectionLimit。确保在进程启动后立即进行此更改,然后再开始与远程主机建立 HTTP 连接。这是因为一旦您实际与远程主机建立 HTTP 连接,就会使用当前默认连接限制为该远程主机创建一个 ServicePoint

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

顺便说一句,如果您对为什么默认限制如此之低感到好奇,它实际上已被纳入 HTTP 规范——目标是确保自私的 HTTP 客户端不会淹没同时连接的 HTTP 服务器。尽管现代浏览器忽略了规范。请参阅http://www.stevesouders.com/blog/2008/03/20/roundup-on-parallel-connections/,了解有关此主题的更多详细信息!

【讨论】:

我们如何在 .net core 中配置它? ServicePointManager 不再是东西 .NET Core 2.0 现在有了ServicePointManager,也可以直接设置为HttpClient。在这里查看我的答案:***.com/questions/1361771/…

以上是关于WebClient、HttpWebRequest 和 HttpClient 的最大并发请求数的主要内容,如果未能解决你的问题,请参考以下文章

WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

WebClient, HttpClient, HttpWebRequest ,RestSharp之间的区别与抉择

c#中webclient,httpwebrequest,webbroser哪个获取网页快

C#通过WebClient/HttpWebRequest实现http的post/get方法

httpWebRequest获取流和WebClient的文件抓取

Linux中用HttpWebRequest或WebClient访问远程https路径