如何为 .NET HttpClient 禁用流水线

How to disable pipelining for the .NET HttpClient

正如标题所说,我想禁用流水线功能,但仍然使用连接池(所以 KeepAlive=False 不是一个选项)。原因是较长的请求可能会阻止较短的请求快速执行,但为每个请求打开一个新连接会明显变慢。

我正在这样做:

_webRequestHandler = new WebRequestHandler();
_webRequestHandler.AllowPipelining = false;

_httpClient = new HttpClient(_webRequestHandler);
await _httpClient.SendAsync(request);

servicePoint = ServicePointManager.FindServicePoint(request.RequestUri);

这似乎没有效果:ServicePoint.SupportsPipelining 属性 仍然正确,WebRequestHandler 仅设置 HttpWebRequest 的 Pipelined 属性 但 HttpRequestMessage 上没有设置,所以基本上设置WebRequestHandler 上的 AllowPipelining 无效 (?)。

我是不是漏掉了什么?我确定这是一种常见情况 - 我该如何实现?

情况依旧:

  • 在 HttpClient 上将 ConnectionClose 设置为 true 会发出 KeepAlive: false 并为每个请求建立新连接。这会对性能产生重大负面影响,因此是不希望的。
  • 将 ConnectionClose 设置为 false 会重用连接 - 但仅当它们空闲时(没有待处理的请求)。有大量并发请求仍然会打开大量连接。
  • 将 HttpClient 上的 ConnectionLimit 设置为 Environment.ProcessorCount * 12(按照 MS 的建议)将打开的连接数限制为指定值。不幸的是,这会导致随机无响应关闭整个系统!我假设当所有打开的连接都被使用时会发生这种情况,流水线被激活然后......发生了一些事情。这就是我想关闭流水线的原因(只需等到任何打开的连接空闲并重新使用它)。

但是好像不能这样设置,至少我没找到也没人帮我。期望 MS 解决真正的问题是......好吧,不太可能。

所以我最终将 ConnectionLimit 设置为 1000,这似乎足够高以至于问题永远不会发生(在我们的系统中)。虽然不是真正的解决方案 - 如果您有更好的解决方案,请随时 post...