动态更改HttpClient.. net中的超时
本文关键字:超时 net HttpClient 动态 | 更新日期: 2023-09-27 18:04:33
我需要在发出请求后更改HttpClient.Timeout
属性。当我尝试时,我得到一个异常:
此实例已经启动了一个或多个请求。属性只能在发送第一个请求之前修改。
有办法避免这种情况吗?
内部Timeout
属性用于设置CancellationTokenSource
,当达到超时时将中止异步操作。由于HttpClient
方法的一些过载接受CancellationTokens
,因此我们可以创建辅助方法,为特定操作设置自定义超时:
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实现中的默认行为。
Timeout属性必须在调用GetRequestStream或GetResponse方法之前设置。HttpClient。超时备注部分
为了改变超时时间,最好创建一个新的HttpClient实例。
client = new HttpClient();
client.Timeout = 20; //set new timeout
在我看来,缺乏对自定义请求级超时的支持一直是HttpClient
的缺点。如果你不介意一个小的库依赖,Flurl。Http[免责声明:我是作者]直接支持:
"http://api.com/endpoint".WithTimeout(30).GetJsonAsync<T>();
这是一个真正的请求级设置;对同一主机的所有调用都在底层使用共享的HttpClient
实例,并且具有不同超时的并发调用不会发生冲突。有一个可配置的全局默认值(初始值为100秒,与HttpClient
相同)。