gpt4 book ai didi

c# - 如何为 .NET HttpClient 禁用流水线

转载 作者:可可西里 更新时间:2023-11-01 02:34:39 28 4
gpt4 key购买 nike

正如标题所说,我想禁用流水线功能,但仍然使用连接池(所以 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,这似乎足够高以至于问题永远不会发生(在我们的系统中)。虽然不是真正的修复 - 如果您有更好的解决方案,请随时发布...

关于c# - 如何为 .NET HttpClient 禁用流水线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53114956/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com