C# 如何使用小超时从http客户端调用web API
我正在处理两个web API项目,这两个项目得到了沟通。第一个web API使用HttpClient类调用第二个web API 我想做的是在调用第二个web API时设置一个短超时(500毫秒),如果在这段时间内没有收到响应,只需跳过下一行在客户端处理结果,但继续在服务器端(第二个API)处理请求 我认为这是由调用的小超时造成的,该超时在第二个API仍在处理结果时结束 如何在第二个API中避免这种行为并继续处理请求C# 如何使用小超时从http客户端调用web API,c#,timeout,asp.net-web-api,dotnet-httpclient,C#,Timeout,Asp.net Web Api,Dotnet Httpclient,我正在处理两个web API项目,这两个项目得到了沟通。第一个web API使用HttpClient类调用第二个web API 我想做的是在调用第二个web API时设置一个短超时(500毫秒),如果在这段时间内没有收到响应,只需跳过下一行在客户端处理结果,但继续在服务器端(第二个API)处理请求 我认为这是由调用的小超时造成的,该超时在第二个API仍在处理结果时结束 如何在第二个API中避免这种行为并继续处理请求 提前感谢。这是预期的行为。当您设置了超时并且调用在该时间段内没有响应时,任务将被
提前感谢。这是预期的行为。当您设置了超时并且调用在该时间段内没有响应时,任务将被取消并引发该异常 顺便说一下,不要使用
.Result
。这将导致阻塞。将方法标记为async
并使用wait
整个事情应该是这样的:
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
}
}
使用(var-client=new-HttpClient())
{
client.DefaultRequestHeaders.Accept.Clear();
client.Timeout=this.Timeout;//(500ms)
尝试
{
HttpResponseMessage response=wait client.postsjsonasync(端点,PostData);
if(响应。IsSuccessStatusCode)
{
return wait response.Content.ReadAsAsync();
}
其他的
{
抛出新的CustomException()
}
}
捕获(TaskCanceledException)
{
//请求未在500毫秒内完成。
返回null;//或其他表示没有数据的内容,请继续
}
}
在这种情况下,我需要继续处理第二个web API中的调用,以将结果存储在缓存/数据库结果中。即使任务被取消了,我怎么能让它继续处理呢?您没有发布整个方法,但我假设,既然您在调用成功时返回结果,那么额外的处理就发生在其他地方?如果是这样的话,您可以从catch块返回null或其他值,以向调用方发出信号,表明它没有足够快地获得结果。显示的方法位于第一个API端,它是调用第二个API的客户端。如果它没有得到结果,我就跳过这个过程,但我的意思是,我需要第二个API继续处理这个调用,即使它被客户端取消了。第二个API,服务器,需要完成任务并将其存储在缓存中,独立客户端超时过期。我在第二个API,服务器端,而不是客户端(第一个API)中得到了异常。啊,我误解了你的问题。不知道第二个API中出现了“持续处理”。据我所知,服务器不应该知道客户端取消了请求。如果您能够在您的开发环境中重新编程,我会说在第二个API中设置一个断点并检查发生了什么。我想这里还有别的原因。谢谢你,托德,这很有道理。
"A task was canceled."
"The operation was cancelled."
at System.Threading.CancellationToken.ThrowOperationCanceledException()
at System.Threading.CancellationToken.ThrowIfCancellationRequested()
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
}
}