AsV*_*leO 16 .net c# timeout dotnet-httpclient
我需要HttpClient.Timeout在提出请求后更改属性.当我尝试时,我得到一个例外:
此实例已启动一个或多个请求.只能在发送第一个请求之前修改属性.
有什么方法可以避免这种情况吗?
And*_*ith 12
你无法改变这一点.这只是HttpClient实现中的默认行为.
必须在调用GetRequestStream或GetResponse方法之前设置Timeout属性. 来自HttpClient.Timeout备注部分
为了更改超时,最好创建一个HttpClient的新实例.
client = new HttpClient();
client.Timeout = 20; //set new timeout
Run Code Online (Sandbox Code Playgroud)
在内部,该Timeout属性用于设置,CancellationTokenSource当达到该超时时间时,该操作将中止异步操作。由于HttpClient方法的一些重载accept 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();
}
}
Run Code Online (Sandbox Code Playgroud)
缺乏对自定义请求级超时的支持一直是HttpClient我心中的一个缺点。如果你不介意一个小的库依赖,Flurl.Http [免责声明:我是作者] 直接支持:
"http://api.com/endpoint".WithTimeout(30).GetJsonAsync<T>();
Run Code Online (Sandbox Code Playgroud)
这是一个真正的请求级设置;对同一主机的所有调用都在后台使用共享HttpClient实例,并且具有不同超时的并发调用不会发生冲突。有一个可配置的全局默认值(最初为 100 秒,与 相同HttpClient)。