近日在系统中集成ElasticClient客户端,自动创建索引、删除索引,发现通过 ElasticClient 的 LowerLevelClient 无法正确返回结果,但是索引已成功创建或删除。

并会在超时时间呢抛出异常”A task was cancelled“,查阅官方文档和Google都无解。

早上重新尝试,改用HttpClient直接进行访问,依然是一样的问题。

无奈,祭出Fiddler,进行请求分析。

1)使用Composer模拟请求,最简单的GET操作,居然也不能立即返回结果

解决 .net HttpClient 调用时出现的  "A task was cancelled" 错误

 

2)使用浏览器直接访问,能够正确返回结果

解决 .net HttpClient 调用时出现的  "A task was cancelled" 错误

 

3)比较Http 请求头,Fiddler 请求头基本都是空的,从浏览器复制Fiddler的请求头过来,最终发现,加上下面的请求头,就能正确返回结果:

Accept-Encoding: gzip, deflate

 解决 .net HttpClient 调用时出现的  "A task was cancelled" 错误

4)对应HttpClient来说,就可以用下面的方法解决了

HttpClientHandler handler = new HttpClientHandler()
            {
                AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate
            };

            var httpClient = new HttpClient(handler)
            {
                BaseAddress = new Uri($"http://{es_host}:{es_port}")
            };

使用这个HttpClient再去访问ElasticSearch,立即就能返回结果。

 

问题分析:服务器端默认情况下返回结果就会使用Gzip压缩,但是客户端默认不处理数据解压,就导致客户端读取数据时,无法判断数据是否已经读取完毕,就一直挂起,直到超时,然后抛出”A task was canceled" 错误。

 HttpClient 其他的 “A task was Canceled” 错误,很可能也是因为Http头设置不正确造成的,而服务器对客户端特性有要求,如本例的Gzip。 

 

 

相关文章:

  • 2021-12-14
  • 2021-11-11
  • 2021-04-01
  • 2021-07-06
  • 2021-06-01
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2021-10-10
  • 2021-09-13
  • 2022-12-23
  • 2021-11-02
  • 2021-08-19
  • 2022-12-23
相关资源
相似解决方案