近日在系統中集成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。