在.NET中动态更改HttpClient.Timeout

时间:2014-05-21 18:17:12

标签: c# .net timeout dotnet-httpclient

我需要在发出请求后更改HttpClient.Timeout属性。当我尝试时,我得到一个例外:

  

此实例已启动一个或多个请求。只能在发送第一个请求之前修改属性。

有什么方法可以避免这种情况吗?

3 个答案:

答案 0 :(得分:11)

你无法改变这一点。这只是HttpClient实现中的默认行为。

  

必须在调用GetRequestStream或GetResponse方法之前设置Timeout属性。   From HttpClient.Timeout Remark Section

为了更改超时,最好创建一个HttpClient的新实例。

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

答案 1 :(得分:4)

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();
    }
}

答案 2 :(得分:3)

缺乏对自定义请求级别超时的支持一直是HttpClient的缺点。如果你不介意一个小的库依赖,Flurl.Http [免责声明:我是作者]直接支持这个:

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

这是一个真正的请求级别设置;对同一主机的所有调用都使用了共享的HttpClient实例,并且具有不同超时的并发调用不会发生冲突。有一个可配置的全局默认值(最初为100秒,与HttpClient相同)。