更改默认超时时间

43
我有以下实现。默认超时时间为100秒。
我想知道如何更改默认超时时间? HttpService.cs
public class HttpService : IHttpService
{

   private static async Task GoRequestAsync<T>(string url, Dictionary<string, object> parameters, HttpMethod method,
        Action<T> successAction, Action<Exception> errorAction = null, string body = "")
        where T : class
    {
        using (var httpClient = new HttpClient(new HttpClientHandler()))
        {

        }
    }
 }

你是否在ServiceCall中使用HttpClient进行了HTTP调用? - Plac3Hold3r
我问的原因是因为HttpClient的默认超时时间为100秒 - Plac3Hold3r
创建任务时,您可以随时减少超时时间。 - Dolev
我们似乎正在深入兔子洞,但我认为我们正在接近目标。你的 IHttpService 实现是什么样子的?它有一个 HttpClient 吗?你只想更改这个特定请求的超时时间,还是所有请求的超时时间? - Plac3Hold3r
顺便说一下,即使HttpClient是IDisposable,你也不应该在“using块”中创建HttpClient实例。你应该为所有请求保留一个HttpClient对象,并在应用程序生命周期结束时或者当你知道不需要更多请求时将其释放。每次请求都创建新的HttpClient会导致频繁请求时出现问题。 - Dawid Jablonski
显示剩余9条评论
4个回答

74
默认的HttpClient超时时间为100秒

HttpClient超时

您可以调整您的HttpClient并在HttpService中设置自定义超时时长。

httpClient.Timeout = 5000;


HttpClient 请求超时

你也可以通过取消令牌 CancellationTokenSource 来定义超时时间

using (var cts = new CancellationTokenSource(new TimeSpan(0, 0, 5)))
{
    await httpClient.GetAsync(url, cts.Token).ConfigureAwait(false);
}

一些建议:

  1. HttpClient内部进行更改将影响所有请求。如果您想每个请求都进行更改,您需要将所需的超时持续时间作为参数传递。
  2. 如果CancellationTokenSource的超时时间低于HttpClient设置的Timeout并且HttpClient的超时时间不是无限的,那么传递CancellationTokenSource的实例将起作用。否则,HttpClient的超时时间将生效。

1
如果我将时间从100秒增加到10分钟,会有什么副作用?有任何缺点吗? - casillas
5
只需要延长超时时间即可。如果您不想让请求在超时后终止,也可以将超时设置为 httpClient.Timeout = Timeout.InfiniteTimeSpan; - Plac3Hold3r
我可以设置为 client.Timeout = new TimeSpan(0,0,500);,那么 CancellationTokenSource 的用途是什么? - Shaiju T
6
CancellationTokenSource可以使您在超时触发之前取消请求。例如,如果用户导航到其他页面并且您不再需要请求的数据,则可以取消请求。 - Plac3Hold3r
@Plac3Hold3r,好的例子 :) 感谢。 - Shaiju T
显示剩余2条评论

32

client.Timeout = TimeSpan.FromMilliseconds(5*1000);因为client.Timeout需要的是System.TimeSpan类型,所以client.Timeout = 5*1000;并不起作用。

我使用以下代码更改了超时时间值:

client.Timeout = TimeSpan.FromSeconds(10); // Timeout value is 10 seconds
你也可以使用其他方法: 仅供参考: Timeout 属性的默认值为 100 秒。

嗨,这种情况下的最大超时值是多少? - toha
@toha 看起来最大值可以设置为InfiniteTimeSpan。请查看此文档:https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient.timeout?view=net-6.0 - SU7

2
由于我们没有看到任何带有超时的任务创建,所以我无法提供帮助。
但是,如果您在应用程序底层使用了System.Net.Http,那么MSDN上说:
默认值为100,000毫秒(100秒)。
然后您可以更改HttpClient.Timeout属性的值。
clent.Timeout = 5*1000;

0

如果你的 HttpService 类有一个依赖于 IHttpClient 接口(而不是直接 new 一个 HttpClient 实例),那么在配置服务时,你可以通过设置客户端的此属性来更改默认值。

例如:

services.AddHttpClient<IHttpService , HttpService >(x => x.Timeout = TimeSpan.FromSeconds(10));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接