我正在尝试从一台机器发送大量的HTTP请求。但似乎.NET Core,或者Windows(我不确定),正在限制可以发送的并发HTTP请求的数量,或者在给定时间段内的HTTP请求配额。
我该如何增加这个限制?我记得在.NET Framework中有一个配置,但我现在也找不到它了。
我正在尝试从一台机器发送大量的HTTP请求。但似乎.NET Core,或者Windows(我不确定),正在限制可以发送的并发HTTP请求的数量,或者在给定时间段内的HTTP请求配额。
我该如何增加这个限制?我记得在.NET Framework中有一个配置,但我现在也找不到它了。
HTTP 1.1协议建议每个域只发出2个并发请求。.NET Framework和.NET Core都使用此限制用于桌面应用程序。ASP.NET应用程序的并发请求限制为10个。这两个运行时环境允许您更改限制。
这个限制在一段时间内对浏览器是有意义的,但对面向服务的应用程序来说过于严格了。现在,浏览器通常允许8个并发连接,而服务/REST应用程序可以处理更多。
ServicePointManager.DefaultConnectionLimit可以用于更改整个应用程序的限制,例如:
ServicePointManager.DefaultConnectionLimit = 100;
您还可以通过使用带有HttpClientHandler.MaxConnectionsPerServer属性设置为所需限制的HttpClientHandler
来为每个HttpClient
实例指定限制:
var handler = new HttpClientHandler
{
MaxConnectionsPerServer= 100,
AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};
HttpClient client = new HttpClient(handler);
通过这种方式,您可以为每个目标服务设置不同的限制。
不要匆忙将限制设置为极大的数字。目标服务可能无法处理来自同一客户端的20或40个并发请求。编写不良的服务可能会导致崩溃或服务器洪泛。并发请求可能会相互阻塞,降低实际吞吐量。编写良好的服务可以对每个客户端强制执行速率限制或排队请求。
您会惊讶地发现,一些所谓的高流量服务的表现非常糟糕。我遇到过航空公司服务,如果在一分钟内发出超过10个并发请求,就会崩溃。配置不良的负载均衡器仍会将流量指向那些已崩溃的服务,至少要等待1-2分钟,直到服务重新启动,这使得重试毫无意义。