我正在使用两个进行通信的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
}
}