如何增加 .NET Core 中的传出 HTTP 请求配额?

moh*_*eli 7 c# concurrency http .net-core

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

我怎样才能增加这个?我记得我们在 .NET Framework 中有一个配置,但我也找不到。

Pan*_*vos 15

HTTP 1.1 协议建议每个域只应发出 2 个并发请求。.NET Framework 和 .NET Core 都将此限制用于桌面应用程序。ASP.NET 应用程序有 10 个并发请求的限制。两个运行时都允许您更改限制。

这个限制在不久前对浏览器来说是有意义的,但对于面向服务的应用程序来说限制太大了。现在浏览器允许大约 8 个并发连接,服务/REST 应用程序可以处理更多。

ServicePointManager.DefaultConnectionLimit可用于更改整个应用程序的限制,例如:

ServicePointManager.DefaultConnectionLimit = 100;
Run Code Online (Sandbox Code Playgroud)

您还可以指定每一个极限HttpClient情况下,通过使用HttpClientHandlerHttpClientHandler.MaxConnectionsPerServer属性设置为所需的限制:

var handler = new HttpClientHandler
{
    MaxConnectionsPerServer= 100,
    AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
};

HttpClient client = new HttpClient(handler);
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以为每个目标服务设置不同的限制。

不要急于将限制设置为一个巨大的数字。目标服务可能无法处理来自同一客户端的 20 或 40 个并发请求。写得不好的服务可能会导致服务器崩溃或泛滥。并发请求可能会相互阻塞,降低实际吞吐量。编写好的服务可能会对每个客户端或队列请求施加速率限制。

您会惊讶于一些所谓的高流量服务的行为有多糟糕。我遇到过如果在一分钟内发出超过10 个并发请求,航空公司服务可能会崩溃。配置不当的负载均衡器仍会将流量引导到那些崩溃的服务至少 1-2 分钟,直到服务重新启动,使重试变得毫无意义。


小智 1

请参阅托德的回答,因为这是一个类似的案例。通常,您可以使用 ServicePointManager.DefaultConnectionLimit 来更改限制。我还鼓励您非常谨慎地执行此操作,因为您也可能会达到临时端口限制或在目标服务器上创建高负载。