zoukankan      html  css  js  c++  java
  • 解决 .net HttpClient 调用时出现的 "A task was cancelled" 错误

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

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

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

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

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

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

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

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

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

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

     

  • 相关阅读:
    js将图片转换为base64
    java 后台将base64字符串保存为图片
    mysql truncate drop delete的区别
    java的反射机制
    mysql的三大范式
    EasyUi datagrid鼠标的悬停效果
    SimpleDateFormat关于时间类的一些常用处理
    mysql修改表字段属性类型
    Spring Boot 之注解@Component @ConfigurationProperties(prefix = "sms")
    tomcat如何修改发布目录
  • 原文地址:https://www.cnblogs.com/mobwiz/p/7908434.html
Copyright © 2011-2022 走看看