如何使用小超时从 http 客户端调用 Web API



我正在使用两个进行通信的Web API项目。第一个 Web API 使用 HttpClient 类调用第二个 Web API。

我想做的是在调用第二个 Web API 时设置一个短超时(500 毫秒),如果我在这段时间内没有得到响应,只需跳过在客户端处理结果的下一行,但继续在服务器端处理请求(第二个 API)。

 using (var client = new HttpClient())
 {
       client.DefaultRequestHeaders.Accept.Clear();
       client.Timeout = this.Timeout; // (500ms)
       HttpResponseMessage response = client.PostAsJsonAsync(EndPoint, PostData).Result;
        if (response.IsSuccessStatusCode)
        {
            return response.Content.ReadAsAsync<T>().Result;
        }
        else
        {
                 throw new CustomException()
        }
 }

它在第一个 API 端工作,但在第二个 API(服务器)中,我得到以下异常:

 "A task was canceled."
 "The operation was cancelled."
 at System.Threading.CancellationToken.ThrowOperationCanceledException()
 at System.Threading.CancellationToken.ThrowIfCancellationRequested()  

我认为这是由调用的小超时引起的,当第二个 API 仍在处理结果时结束。

如何在第二个 API 中避免此行为并继续处理请求?

提前谢谢。

这是预期的行为。当您设置超时并且调用在该时间内没有响应时,任务将被取消并引发该异常。

顺便说一句,不要使用.Result.这将导致阻塞。将您的方法标记为async并使用await

整个事情应该看起来像这样:

 using (var client = new HttpClient())
 {
    client.DefaultRequestHeaders.Accept.Clear();
    client.Timeout = this.Timeout; // (500ms)
    try
    {
        HttpResponseMessage response = await client.PostAsJsonAsync(EndPoint, PostData);
        if (response.IsSuccessStatusCode)
        {
            return await response.Content.ReadAsAsync<T>();
        }
        else
        {
            throw new CustomException()
        }
    }
    catch (TaskCanceledException)
    {
        // request did not complete in 500ms.
        return null; // or something else to indicate no data, move on
    }
 } 

相关内容

  • 没有找到相关文章

最新更新