如何在.NET Core中增加出站HTTP请求配额?

13

我正在尝试从一台机器发送大量的HTTP请求。但似乎.NET Core,或者Windows(我不确定),正在限制可以发送的并发HTTP请求的数量,或者在给定时间段内的HTTP请求配额。

我该如何增加这个限制?我记得在.NET Framework中有一个配置,但我现在也找不到它了。


你能否在 .net 框架中发布你的配置? - Mohammad Ghanem
正如我所说,我现在正在使用.NET Core工作。 - mohammad rostami siahgeli
你说配置在 .net framework 中可以工作,我想看看这个配置以帮助你将其映射到 .net core。 - Mohammad Ghanem
@Damien_The_Unbeliever,如何增加默认值? - mohammad rostami siahgeli
显示剩余7条评论
2个回答

19

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分钟,直到服务重新启动,这使得重试毫无意义。


根据https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclienthandler.maxconnectionsperserver?view=netframework-4.7.2,HttpClient的MaxConnectionPerserver现在是Int32.MaxValue。 当我在.net framework 4.8中使用反射进行检查时,也显示为int的最大值。 - undefined

1
请参考Todd的回答,因为这是一个类似的情况。通常情况下,您可以使用ServicePointManager.DefaultConnectionLimit来更改限制。我还强烈建议您谨慎行事,因为您也可能会达到临时端口限制或在目标服务器上创建高负载。

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