繁体   English   中英

为什么不能为HttpClient的每个请求指定超时?

[英]Why can't I specify Timeout per request for HttpClient?

实际的问题是:为什么以只能为整个HttpClient设置Timeout属性的方式而不是基于每个请求的方式实现HttpClient?

这是我的用例:

  • 我有一个向其他外部服务器发出请求的应用程序
  • 对不同服务器的请求可能需要具有不同的读取超时值
  • 我希望能够为每个请求动态配置超时值,并在每个请求中读取它。 尽管此值很少更改。
  • 我想利用连接池,所以我需要缓存HttpClient而不是在每个请求上创建一个新的

假设我对不同的终结点有不同的超时值,则需要有单独的HttpClient。 每个端点一个。

现在的问题是:我们可以为整个HttpClient实例设置Timeout值的事实背后的原因是什么?

我最初的想法是,与超时有关的是tcp连接的属性,该属性是在HttpClient后面创建的,只能为整个连接设置。 但是在对HttpClient的反编译源进行调查之后,我发现Timeout设置如下:

private void SetTimeout(CancellationTokenSource cancellationTokenSource)
{
  if (!(this.timeout != HttpClient.infiniteTimeout))
    return;
  cancellationTokenSource.CancelAfter(this.timeout);
}

除此以外,我找不到其他用途。 将超时设置为CancellationTokenSource似乎与tcp连接没有任何关系,并且正在为每个请求创建CancellationTokenSource本身。

欢迎任何想法和见解。 谢谢。

对于此类工作,我使用https://github.com/jgiacomini/Tiny.RestClient

对于每个请求,您都可以这样设置超时:request.WithTimeout(TimeSpan.FromSeconds(100));

有了它,您可以共享相同的HttpClient,并根据请求具有不同的超时时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM