HttpClient 获取请求取消,以防操作时间超过 x 分钟
HttpClient get request cancellation, in case the operation takes longer than x minutes
我正在编写一个每 15 分钟同步一次数据的 azure 函数。
我的目标是 .net 3.1 的 azure 功能,我正在使用 httpclient 向他们的 API.
发送获取请求
var response = await client.GetStringAsync()
通常需要大约 20 秒才能得到结果,但是,有时他们的服务器没有正确处理请求或者它只是很忙,并且花费的时间太长或者没有 return 任何数据.我已经在邮递员中进行了测试,状态为 Ok 200,但它持续加载了很多分钟,但没有任何反应。
但是,如果您只是取消操作,然后重试,则响应正常。
现在我的问题是,我如何跟踪从我的 get client.GetStringAsync()
方法获得结果所花费的时间,并且如果假设它超过 2 分钟则以某种方式取消该操作?
如果您使用的是 .NET 5,则可以使用 CancellationTokenSource with a 'cancel after' and pass the token to client.GetStringAsync()
,如下所示:
var cts = new CancellationTokenSource()
cts.CancelAfter(120000); // Cancel after 2 minutes
try
{
var response = await client.GetStringAsync(uri, cts.Token);
}
catch (TaskCanceledException)
{
Console.WriteLine("\nTask cancelled due to timeout.\n");
}
然后您可以将操作包装在 try-catch 块中,以查看操作是否被令牌取消。
参考:Cancel async tasks after a period of time (C#)
更新
在 .NET Core 上,您可以 specify a timeout for your HttpClient。但是请注意,此超时适用于您使用该 HttpClient 实例发送的所有请求。如果你想这样做,你可以这样做:
client.Timeout = TimeSpan.FromMinutes(2);
try
{
var response = await client.GetStringAsync(uri);
}
catch (TaskCanceledException)
{
Console.WriteLine("\nRequest cancelled due to timeout.\n");
}
我正在编写一个每 15 分钟同步一次数据的 azure 函数。 我的目标是 .net 3.1 的 azure 功能,我正在使用 httpclient 向他们的 API.
发送获取请求var response = await client.GetStringAsync()
通常需要大约 20 秒才能得到结果,但是,有时他们的服务器没有正确处理请求或者它只是很忙,并且花费的时间太长或者没有 return 任何数据.我已经在邮递员中进行了测试,状态为 Ok 200,但它持续加载了很多分钟,但没有任何反应。 但是,如果您只是取消操作,然后重试,则响应正常。
现在我的问题是,我如何跟踪从我的 get client.GetStringAsync()
方法获得结果所花费的时间,并且如果假设它超过 2 分钟则以某种方式取消该操作?
如果您使用的是 .NET 5,则可以使用 CancellationTokenSource with a 'cancel after' and pass the token to client.GetStringAsync()
,如下所示:
var cts = new CancellationTokenSource()
cts.CancelAfter(120000); // Cancel after 2 minutes
try
{
var response = await client.GetStringAsync(uri, cts.Token);
}
catch (TaskCanceledException)
{
Console.WriteLine("\nTask cancelled due to timeout.\n");
}
然后您可以将操作包装在 try-catch 块中,以查看操作是否被令牌取消。
参考:Cancel async tasks after a period of time (C#)
更新
在 .NET Core 上,您可以 specify a timeout for your HttpClient。但是请注意,此超时适用于您使用该 HttpClient 实例发送的所有请求。如果你想这样做,你可以这样做:
client.Timeout = TimeSpan.FromMinutes(2);
try
{
var response = await client.GetStringAsync(uri);
}
catch (TaskCanceledException)
{
Console.WriteLine("\nRequest cancelled due to timeout.\n");
}