2014-05-21 33 views
12

我在創建請求後需要更改HttpClient.Timeout屬性。當我嘗試時,我收到一個異常:動態更改.NET中的HttpClient.Timeout

此實例已經啓動了一個或多個請求。屬性只能在發送第一個請求之前修改。

有什麼辦法可以避免這種情況嗎?

+0

消息不明確嗎? –

+0

請求前設置? – geedubb

+0

@ L.B。,信息很清楚。但我仍然想知道是否有任何技巧可以避免這種情況。 geedubb,我需要改變之後。 – AsValeO

回答

8

你可以做些什麼來改變這一點。這只是HttpClient實現中的默認行爲。

在調用GetRequestStream或GetResponse方法之前,必須設置Timeout屬性。 From HttpClient.Timeout Remark Section

爲了改變超時,這將是最好創建一個HttpClient的一個新的實例。

client = new HttpClient(); 
client.Timeout = 20; //set new timeout 
+2

注意:創建/配置'HttpClient'可能會導致套接字耗盡問題:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Monsignor

3

內部的Timeout屬性用於建立一個CancellationTokenSource達到該超時時將中止異步操作。由於的HttpClient方法的一些重載接受CancellationTokens,我們可以創建的helper方法有具體操作的自定義超時:

public async Task<string> GetStringAsync(string requestUri, TimeSpan timeout) 
{ 
    using (var cts = new CancellationTokenSource(timeout)) 
    { 
     HttpResponseMessage response = await _httpClient.GetAsync(requestUri, cts.Token) 
     response.EnsureSuccessStatusCode(); 

     return await response.Content.ReadAsStringAsync(); 
    } 
} 
+2

值得注意的是,HttpClient上設置的任何超時仍將被強制執行。這隻能減少請求超時所需的時間;它不能增加它。 –

2

的定製請求級超時支持缺乏一直是HttpClient一個缺點在我心中。如果你不介意一個小型圖書館的依賴,Flurl.Http [免責聲明:我是作者]這也直接支持:

"http://api.com/endpoint".WithTimeout(30).GetJsonAsync<T>(); 

這是一個真實請求級設置;所有對同一主機的呼叫均使用共享的HttpClient實例,並且具有不同超時的併發呼叫不會發生衝突。有一個可配置的全局默認值(最初爲100秒,與HttpClient相同)。