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");
}