【问题标题】:How to disable pipelining for the .NET HttpClient如何为 .NET HttpClient 禁用流水线
【发布时间】:2018-11-02 08:21:37
【问题描述】:

正如标题所说,我想禁用流水线功能,但仍然使用连接池(因此 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 没有效果(?)。

我在这里遗漏了什么吗?我确定这是一种常见的情况 - 我该如何实现?

【问题讨论】:

  • longer requests may prevent shorter requests from executing fast 你是怎么找到的?看看this
  • SupportsPipeliningAllowPipelining 完全不同。如果您支持某些东西,则可以决定是否允许使用它。如果您不支持某些东西,无论您是否允许使用它都无关紧要,那么您根本无法使用它。支持是事实,允许是决定,但决定不会影响事实
  • @skyoxZ 我看不出您的链接应该有什么帮助?有关您的问题的解释,请参阅stackoverflow.com/questions/14810890/…(请参阅“线头阻塞”)。
  • @SirRufo 好的。但是我怎样才能关闭它呢?
  • 构建一个继承自 HttpClient 的新类,确保将 AllowPipelining 设置为 false 并使用该类。你也可以为此建一个工厂,或者...

标签: c# .net tcp dotnet-httpclient


【解决方案1】:

情况依旧:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-17
    • 2015-08-09
    • 2015-11-06
    • 2012-06-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多