3

我試圖爲我的HttpClient調用設置一個默認的超時時間爲5秒。HttpClient取消不殺死底層的TCP通話

我已通過CancellationTokenSource完成了此操作。

這裏的代碼的相關位:

var cancellationToken = new CancellationTokenSource(); 
cancellationToken.CancelAfter(TimeSpan.FromSeconds(5)); 
var result = _httpClient.SendAsync(request, cancellationToken.Token); 

工程,我預計在調用代碼得到一個方面「任務被取消」的錯誤(我在.NET 4.7的控制檯應用程序進行測試),但我在提琴手注意到請求仍在運行1分鐘,直到它最終還是放棄了:

enter image description here

有人能解釋這種現象?

我希望在取消觸發時,底層請求也會被取消。

_httpClient被實例化,如:new HttpClient { BaseAddress = baseAddress }

我知道有在該Timeout設置,但不知道我是否應該使用或取消標記?我的猜測是Timeout是針對非異步/等待的情況?

+3

HTTP 1.1中沒有「取消此請求」操作,除了拆除整個連接外 - 我猜測HttpClient不支持Keepalive /連接重用。 –

+0

@Damien_The_Unbeliever啊......當然......完全忘了'Keep-Alive'。順便說一句,你可以在HTTP客戶端中將Keep-Alive設置爲false(默認值爲true,因爲很好理由) – RPM1984

+1

@Damien_The_Unbeliever,但是已經說過 - 如果我們不能取消底層的_request_(不是連接,而是_request_)那麼取消令牌的意義何在?只是讓客戶端(瀏覽器,或在我的示例控制檯應用程序)不關心結果了? (但請求可能仍然在後臺運行) – RPM1984

回答

1

正如Damien在評論中所說的,HttpClient儘可能地重新使用了連接,因此連接在取消時沒有關閉。

當取消這樣的請求時,HttpClient將停止向/從另一端發送/接收數據。它不會發送任何信息通知對方它已被取消。因此,您看到1分鐘的超時取決於連接另一端的行爲。

另外,如果您想在5秒後取消每個請求,您還可以將_httpClientTimeout屬性設置爲TimeSpan.FromSeconds(5)。行爲將完全相同(如果另一端在5秒內沒有響應,則會引發TaskCanceledException)。