HttpClient 超时似乎不起作用

Posted

技术标签:

【中文标题】HttpClient 超时似乎不起作用【英文标题】:HttpClient Timeout does not appear to be working 【发布时间】:2018-01-23 20:38:12 【问题描述】:

我有一个如下所示的 Web API 控制器:

[Route("api/[controller]")]
public class SlowController : Controller

    [HttpPost]
    public ActionResult Post([FromBody]SlowRequest request)
    
        var response = new SlowResponse();
        response.Id = request.Id;
        response.StartDate = DateTime.Now;
        Thread.Sleep(new TimeSpan(0, 3, 0));
        response.EndDate = DateTime.Now;

        return Ok(response);
    

注意如何有 3 分钟的睡眠。这是为了模拟post动作需要很长时间才能返回。

我有一个调用此 Web API 的客户端控制台应用程序:

static void Main(string[] args)

    try
    
        var request = new SlowRequest();
        request.Id = Guid.NewGuid();

        var json = JsonConvert.SerializeObject(request);

        var httpClient = new HttpClient();
        httpClient.Timeout = new TimeSpan(0, 5, 0);
        httpClient.BaseAddress = new Uri("http://localhost:54316/");
        var result = httpClient.PostAsync("api/slow", new StringContent(json, Encoding.UTF8, "application/json")).Result.EnsureSuccessStatusCode();
        var apiResponse = result.Content.ReadAsStringAsync().Result;
        var response = JsonConvert.DeserializeObject<SlowResponse>(apiResponse);

        Console.WriteLine("Start Time = " + response.StartDate);
        Console.WriteLine("End Time = " + response.EndDate);

    
    catch (Exception ex)
    
        Console.WriteLine(ex.Message);
    

不幸的是,客户端在 2 分钟后抛出异常:

响应状态码不表示成功:502(网关错误)。

似乎如果 API 需要超过 2 分钟才能返回这个,就会发生异常。不到 2 分钟,它工作得很好。尽管我已经在客户端设置了 5 分钟的超时时间。如何防止需要很长时间的 Web API 调用出现这样的错误?

【问题讨论】:

提示:与其使用构造函数new TimeSpan(0, 5, 0),不如使用静态方法TimeSpan.FromMinutes(5) 看起来更好、更容易阅读。 【参考方案1】:

问题不是来自客户端,而是来自服务器。你睡了 3 分钟,这超过了默认的请求超时。您可以在 web.config 中更改它:

<aspNetCore requestTimeout="00:05:00" ... />

请注意,该值只能以整分钟为单位指定,否则默认为 2 分钟。请参阅Core configuration reference。

Kersel 还有一个 2 分钟的超时,您需要在 Program.cs 中更改:

.UseKestrel(o => o.Limits.KeepAliveTimeout = TimeSpan.FromMinutes(5));

请参阅Keep​Alive​Timeout Property。

注意:我假设您的项目是 Core。如果不是这种情况,则必须更改 web.config 中的 executionTimeout 属性。默认为 110 秒:

<system.web>
    <httpRuntime executionTimeout="300" />
</system.web>

请参阅ExecutionTimeout Property。

【讨论】:

以上是关于HttpClient 超时似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章

当 API 关闭时,Xamarin 表单依赖注入 HttpClient 超时不起作用

Python 超时似乎不起作用

Android上的Http连接超时不起作用

Angular 5 HTTPClient 基本授权不起作用

C# HttpClient 通用 SendAysnc 不起作用

c# httpclient 授权标头对我不起作用?