HttpClient获取请求取消,以防操作时间超过x分钟
Posted
技术标签:
【中文标题】HttpClient获取请求取消,以防操作时间超过x分钟【英文标题】:HttpClient get request cancellation, in case the operation takes longer than x minutes 【发布时间】: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 分钟?
【问题讨论】:
查看最佳答案:***.com/questions/34292089/… 你考虑过波莉的Timeout吗? 【参考方案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。采用第二种方法! @GencHaniCancellationTokenSource
确实有 a constructor,您可以在其中指定超时。请注意设置客户端的Timeout
。这是一个全局超时,适用于每个请求。
@PeterCsala 感谢您的评论。好吧,由于我使用的是 azure 函数,并且在我的情况下,它将每 15 分钟触发一次,并且只会执行一项工作(每次调用相同的确切端点),我想这不是问题。以上是关于HttpClient获取请求取消,以防操作时间超过x分钟的主要内容,如果未能解决你的问题,请参考以下文章
HTTP 请求 PostAsync 与 HttpClient 取消请求或资源暂时不可用
取消 HttpClient 请求 - 为啥 TaskCanceledException.CancellationToken.IsCancellationRequested 为假?
在 Angular httpclient 拦截器中处理取消的 http 请求
HttpClient--使用HttpClient进行Get Post请求访问
centos--该虚拟机似乎正在使用中。 如果该虚拟机未在使用,请按“获取所有权(T)”按钮获取它的所有权。否则,请按“取消(C)”按钮以防损坏。