【问题标题】:DelegatingHandler and HttpClient in a loop循环中的 DelegatingHandler 和 HttpClient
【发布时间】:2019-11-20 09:22:41
【问题描述】:

我正在尝试循环执行HttpClient.GetAsync
根据Microsoft Doc,建议使用HttpClient 的1 个实例。

我得到HttpClient 的方式是

var httpClient = HttpClientFactory.Create(HttpClientRequestHandler.HttpMessageHandler, delegatingHandler);

它第一次很好地命中了GetAsync 函数,但是当我重用httpClient 引用时,我得到了错误:The 'DelegatingHandler' list is invalid because the property 'InnerHandler' of 'HttpClientTelemetryHandler' is not null.

当我每次都尝试在循环中创建一个新的HandlerHttpClient 实例时,它工作正常。

现在这是利益冲突。我应该每次在循环中创建一个新实例,还是有任何其他方法可以做到这一点,这是正确的方法。

附加信息:我用来创建HttpClient 的自定义库是.Net Standard 2.0,调用HttpClient 的客户端应用程序是.Net Core 2.1

感谢任何帮助。

谢谢。

【问题讨论】:

  • 为什么需要这样创建HttpClient?你能分享一些代码吗?

标签: c# loops dotnet-httpclient delegatinghandler httpclienthandler


【解决方案1】:

当您在批处理或循环中重复使用相同的 Handler 实例时,通常会发生此错误。

在每个请求结束时正确处理 HttpClient 可以防止此错误。

public class Test{
 private static HttpClient _httpClient;

 SomeFunction(){
 using (var client = new HttpClient(
       HttpClientFactory.CreatePipeline(
       new HttpClientHandler
           {
              CookieContainer = new CookieContainer(),
              UseCookies = true
            },
       new DelegatingHandler[] { new CustomHandler() })))
    {
         //do something with `client`
    }  

 }
}

【讨论】:

  • 感谢 HariHaran 的回复。但是,似乎 Dispose 在HttpClient 的情况下并没有完全进行清理,从这个文档可以理解:aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong
  • @AlenAlex 再次阅读。解决方案是使用static 客户端。我已经在答案中使用过。在你的代码上试试
猜你喜欢
  • 2020-04-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多