【问题标题】:HttpClient get request cancellation, in case the operation takes longer than x minutesHttpClient获取请求取消,以防操作时间超过x分钟
【发布时间】:2020-12-17 22:31:14
【问题描述】:

我正在编写一个 azure 函数,它每 15 分钟同步一次数据。 我的目标是 .net 3.1 用于 azure 功能,并且我正在使用 httpclient 向他们的 API 发送 get 请求。

var response = await client.GetStringAsync()

通常需要大约 20 秒才能获得结果,但是,有时他们的服务器无法正确处理请求或只是忙,并且需要太长时间才能完成或不返回任何数据。我已经在邮递员中进行了测试,我的状态为 Ok 200,但它会持续加载几分钟,但什么也没有发生。 但是,如果您只是取消操作,然后再试一次,则响应正常。

现在我的问题是,我怎样才能跟踪结果来自我的 get client.GetStringAsync() 方法所花费的时间,并以某种方式取消操作,如果假设它超过 2 分钟?

【问题讨论】:

标签: c# .net .net-core azure-functions dotnet-httpclient


【解决方案1】:

如果您使用的是 .NET 5,则可以使用带有“取消之后”的 CancellationTokenSource 并将令牌传递给 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");
}

【讨论】:

  • 感谢您的意见。我在这里遇到编译器错误,说明 GetStringAsync 没有重载需要 2 个参数。似乎我无法将取消令牌传递给此方法。
  • @GencHani,对不起。我上面列出的第一个选项仅在 .NET 5 上可用。但您可以在 .NET Core 上使用 HttpClient 超时
  • 谢谢@Frank Fajardo。采用第二种方法!
  • @GencHani CancellationTokenSource 确实有 a constructor,您可以在其中指定超时。请注意设置客户端的Timeout。这是一个全局超时,适用于每个请求。
  • @PeterCsala 感谢您的评论。好吧,由于我使用的是 azure 函数,并且在我的情况下,它将每 15 分钟触发一次,并且只会执行一项工作(每次调用相同的确切端点),我想这不是问题。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2018-07-03
  • 1970-01-01
  • 1970-01-01
  • 2016-03-08
  • 2016-09-22
  • 2015-10-15
  • 1970-01-01
相关资源
最近更新 更多