我在創建請求後需要更改HttpClient.Timeout
屬性。當我嘗試時,我收到一個異常:動態更改.NET中的HttpClient.Timeout
此實例已經啓動了一個或多個請求。屬性只能在發送第一個請求之前修改。
有什麼辦法可以避免這種情況嗎?
我在創建請求後需要更改HttpClient.Timeout
屬性。當我嘗試時,我收到一個異常:動態更改.NET中的HttpClient.Timeout
此實例已經啓動了一個或多個請求。屬性只能在發送第一個請求之前修改。
有什麼辦法可以避免這種情況嗎?
你可以做些什麼來改變這一點。這只是HttpClient實現中的默認行爲。
在調用GetRequestStream或GetResponse方法之前,必須設置Timeout屬性。 From HttpClient.Timeout Remark Section
爲了改變超時,這將是最好創建一個HttpClient的一個新的實例。
client = new HttpClient();
client.Timeout = 20; //set new timeout
注意:創建/配置'HttpClient'可能會導致套接字耗盡問題:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/ – Monsignor
內部的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();
}
}
值得注意的是,HttpClient上設置的任何超時仍將被強制執行。這隻能減少請求超時所需的時間;它不能增加它。 –
的定製請求級超時支持缺乏一直是HttpClient
一個缺點在我心中。如果你不介意一個小型圖書館的依賴,Flurl.Http [免責聲明:我是作者]這也直接支持:
"http://api.com/endpoint".WithTimeout(30).GetJsonAsync<T>();
這是一個真實請求級設置;所有對同一主機的呼叫均使用共享的HttpClient
實例,並且具有不同超時的併發呼叫不會發生衝突。有一個可配置的全局默認值(最初爲100秒,與HttpClient
相同)。
消息不明確嗎? –
請求前設置? – geedubb
@ L.B。,信息很清楚。但我仍然想知道是否有任何技巧可以避免這種情況。 geedubb,我需要改變之後。 – AsValeO