Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用小超时从http客户端调用web API_C#_Timeout_Asp.net Web Api_Dotnet Httpclient - Fatal编程技术网

C# 如何使用小超时从http客户端调用web 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中避免这种行为并继续处理请求 提前感谢。这是预期的行为。当您设置了超时并且调用在该时间段内没有响应时,任务将被

我正在处理两个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
    }
 }