解决 .net HttpClient 调用时出现的 "A task was cancelled" 错误
2024-10-21 10:34:54
近日在系统中集成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。
最新文章
- 背后的故事之 - 快乐的Lambda表达式(一)
- 安卓中的Model-View-Presenter模式介绍
- Surprise团队第三周项目总结
- mysql select 格式化输出
- Http返回码
- c# Linq及Lamda表达式应用经验之 GroupBy 分组
- strtok、strtok_s、strtok_r 字符串切割函数
- js实现数组去重并且显示重复的元素和索引值
- .9-浅析webpack源码之NodeEnvironmentPlugin模块总览
- 【并发编程】一个最简单的Java程序有多少线程?
- linux权限字母的含义
- Python之AJAX
- HTTP status constants
- springboot+thymeleaf简单使用
- 开源CFD并非万金油
- SpringMVC由浅入深day01_8springmvc和mybatis整合
- Android - fragment之间数据传递
- FullCalendar Timeline View 使用
- MVC日期格式化,后台使用Newtonsoft.Json序列化日期,前端使用”f”格式化日期
- 说说 PADS Layout 中的第 20 层和 第 25层
热门文章
- 「Python」pandas入门教程
- SQL Server 2008如何开启数据库的远程连接
- 在使用Hibernate save()方法的时候 报错: org.hibernate.exception.ConstraintViolationException:could not perform addBath
- Codechef Observing the Tree
- select表单元素详解及下拉列表模拟实现
- ASP.Net Web 服务 – 如何使用会话状态
- [POJ2356]Find a multiple 题解(鸽巢原理)
- 【leetcode 简单】第二十三题 二叉树的最大深度
- 如何写出优雅的js以及js特殊技巧
- spring boot 加载原理