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

近日在系统中集成ElasticClient客户端,自动建立索引、删除索引,发现经过 ElasticClient 的 LowerLevelClient 没法正确返回结果,可是索引已成功建立或删除。浏览器

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

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

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

1)使用Composer模拟请求,最简单的GET操做,竟然也不能当即返回结果blog

 

2)使用浏览器直接访问,可以正确返回结果索引

 

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

Accept-Encoding: gzip, deflate

 

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,当即就能返回结果。io

 

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

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

相关文章
相关标签/搜索