消耗休息 API 超时

本文关键字:API 超时 | 更新日期: 2023-09-27 18:34:18

如何处理调用REST服务时的超时问题。我的 GetAsync 函数:

    private async Task<string> GetAsync(string endPoint, string id)
    {
        using (var httpClient = new HttpClient())
        {
            SevenMResultNx<string> result = new SevenMResultNx<string>(false);
            httpClient.BaseAddress = new Uri(baseAddress);
            httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));
            httpClient.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(token);
            // HTTP GET
            HttpResponseMessage response = await httpClient.GetAsync(String.Format("{0}/{1}", endPoint, id));
            if (response.IsSuccessStatusCode)
            {
                return await response.Content.ReadAsStringAsync();
            }
            else
            {
                return response.ReasonPhrase;
            }
        }
    }

被称为:

        Task<string> task = GetAsync(endPoint, id);
        var responseGet = task.Result;

每当端点不可用时,我都遇到了问题,因为进程等待无限。

消耗休息 API 超时

我建议让你的方法接受一个CancellationToken,然后你可以传递给GetAsyncReadAsStringAsync方法。

您可以轻松创建一个取消令牌,该令牌将在一定时间后过期:

var cts = new CancellationTokenSource(TimeSpan.FromSeconds(1));
var text = await GetAsync(endpoint, id, cts.Token);

此外,在调用方中使用Result几乎可以肯定是一个错误。这意味着,如果您使用的是具有单个线程的计划程序,您将死锁 - 您的线程将等待任务完成,但它将无法完成,因为当httpClient.GetAsync调用完成时,它需要在同一线程中执行更多代码。两项改进:

  • 在等待任务的GetAsync方法中,请使用ConfigureAwait(false)因为您可能不关心异步方法的其余部分继续在哪个线程上
  • 使调用代码也异步,并等待返回的任务。