解決 .net HttpClient 調用時出現的 "A task was cancelled" 錯誤
阿新 • • 發佈:2017-11-28
rdquo .cn 但是 strong 錯誤 調用 官方文檔 簡單的 cell
近日在系統中集成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。
解決 .net HttpClient 調用時出現的 "A task was cancelled" 錯誤