在.NET中动态更改HttpClient.Timeout
我需要在发出请求后更改HttpClient.Timeout
属性。 当我尝试时,我得到一个例外:
此实例已启动一个或多个请求。 只能在发送第一个请求之前修改属性。
有什么方法可以避免这种情况吗?
你无法改变这一点。 这只是HttpClient实现中的默认行为。
必须在调用GetRequestStream或GetResponse方法之前设置Timeout属性。 来自HttpClient.Timeout备注部分
为了更改超时,最好创建一个HttpClient的新实例。
client = new HttpClient(); client.Timeout = 20; //set new timeout
在内部, Timeout
属性用于设置CancellationTokenSource
,当达到超时时,该属性将中止异步操作。 由于HttpClient
方法的一些重载接受CancellationTokens
,我们可以创建辅助方法来为特定操作设置自定义超时:
public async Task 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
的缺点。 如果你不介意一个小的库依赖, Flurl.Http [免责声明:我是作者]直接支持这个:
"https://api.com/endpoint".WithTimeout(30).GetJsonAsync();
这是一个真正的请求级别设置; 对同一主机的所有调用都使用了共享的HttpClient
实例,并且具有不同超时的并发调用不会发生冲突。 有一个可配置的全局默认值(最初为100秒,与HttpClient
相同)。
上述就是C#学习教程:在.NET中动态更改HttpClient.Timeout分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/cdevelopment/1000613.html