1. 程式人生 > >解決 .net HttpClient 調用時出現的 "A task was cancelled" 錯誤

解決 .net HttpClient 調用時出現的 "A task was cancelled" 錯誤

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" 錯誤