如何禁用.NET HttpClient的流水线处理

4
如标题所述,我希望禁用流水线功能,但仍然利用连接池(因此KeepAlive=False不是选择)。原因是较长的请求可能会阻止较短的请求快速执行,但为每个请求打开新连接显着更慢。 我正在这样做:
_webRequestHandler = new WebRequestHandler();
_webRequestHandler.AllowPipelining = false;

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

servicePoint = ServicePointManager.FindServicePoint(request.RequestUri);

这似乎没有效果:ServicePoint.SupportsPipelining属性仍为true,而WebRequestHandler仅设置HttpWebRequest的Pipelined属性,但没有在HttpRequestMessage上进行任何设置,因此在WebRequestHandler上设置AllowPipelining没有效果(?)。
我是否漏掉了什么? 我确定这是一个常见情况 - 我该如何实现?

长时间的请求可能会阻碍短时间的请求快速执行。你觉得怎么样?并且请查看此链接:https://learn.microsoft.com/en-us/dotnet/api/system.net.servicepointmanager.defaultconnectionlimit?view=netframework-4.7.2 - skyoxZ
"SupportsPipelining" 和 "AllowPipelining" 是完全不同的概念。如果你支持某个功能,那么你可以决定是否允许使用它。如果你不支持某个功能,无论你是否允许使用它,都不能使用。支持是一个事实,而允许是一个决定,但这个决定不会影响事实。 - Sir Rufo
@SirRufo 好的。但是我该如何实现关闭它? - srudin
构建一个新的类,继承自HttpClient,并确保将AllowPipelining设置为false并使用该类。您也可以为此创建一个工厂,或者... - Sir Rufo
@SirRufo HttpClient上不存在AllowPipelining。请再次阅读我的问题以了解关于此问题的情况。 - srudin
显示剩余5条评论
1个回答

0
情况仍然存在:
  • 在HttpClient上将ConnectionClose设置为true会发出KeepAlive:false并为每个请求建立新连接。这对性能有显着的负面影响,因此不希望这样做。
  • 将ConnectionClose设置为false会重用连接-但仅当它们是空闲的(没有挂起的请求)时才会这样做。同时有大量的请求仍然会打开大量的连接。
  • 将HttpClient上的ConnectionLimit设置为Environment.ProcessorCount * 12(如MS所建议的)会将打开的连接数限制为指定值。不幸的是,这会导致随机的无响应并关闭整个系统!我认为这是在使用所有打开的连接、激活流水线然后...发生的。这就是为什么我想要关闭流水线(只需等待任何打开的连接变为空闲状态并重用它)。

但似乎不能以这种方式设置,至少我找不到,并且没有人能帮助我。而期望MS解决真正的问题...嗯,不太可能。

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


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