Azure函数HTTP触发器未取消请求
Posted
技术标签:
【中文标题】Azure函数HTTP触发器未取消请求【英文标题】:Azure function HTTP Trigger not cancelling request 【发布时间】:2021-06-11 15:03:27 【问题描述】:当我取消从浏览器到 HTTP 触发器的请求时,它不会取消并在 Azure 上托管时继续执行。
我的函数示例:
[FunctionName("Test")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req,
CancellationToken cancellationToken,
ILogger log)
var allCancellationTokens = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, req.HttpContext.RequestAborted);
await Task.Delay(30000, allCancellationTokens.Token);
if (allCancellationTokens.IsCancellationRequested)
log.LogInformation("Request was cancelled!");
return new StatusCodeResult(499);
return new OkObjectResult("Complete");
我一直在通过 Postman 和 axios 取消令牌测试取消。 当我在本地运行项目并取消它时它可以工作,但一旦它发布到 azure 似乎就不会取消。
我的预期结果是,如果我在await Task.Delay(30000, allCancellationTokens.Token);
期间取消请求,它会抛出一个OperationCanceledException
但是当检查 Azure Functions 上的日志时,似乎只是继续执行并完成该功能。
重现步骤:
-
创建一个类似于上面定义的 HTTP 触发器。
将应用发布到 Azure。
在监控部分打开 Azure 上的函数日志。
使用 Postman 向该函数发送请求并取消请求(在 30 秒的超时时间内)。
不会取消请求,仍会执行。
【问题讨论】:
您是否尝试过执行以下操作? (这只是为了试验)而不是有一个 30 秒的延迟,有六个 5 秒的延迟。在每次延迟之间调用allCancellationTokens.Token.ThrowIfCancellationRequested
。这会取消你的功能吗?
您在哪个版本的 Azure Functions 上运行?
@PeterCsala 我做了以下更改:gist.github.com/Jamess-Lucass/533ec5524d82d02886a5be67a46d00b0 并且在取消请求后它似乎仍在执行
@SebastianAchatz 我正在使用 Azure Functions v3
@James 我在这里使用“request.HttpContext.RequestAborted”运行了一个 v3 函数,它对我来说很好用。但是我没有通过注入的 CT 合并主机取消并执行 CancellationTokenSource.CreateLinkedTokenSource。您可以尝试检查这是否适合您吗?
【参考方案1】:
CancellationToken
有助于实现 Functions 运行时主机的正常关闭,当操作系统通知它出现问题以终止它时,请参阅以下答案了解更多信息:https://***.com/a/63439515/528779
【讨论】:
以上是关于Azure函数HTTP触发器未取消请求的主要内容,如果未能解决你的问题,请参考以下文章
Azure Functions:获取完整的请求 URL,包括 HTTP 触发器函数中的查询字符串
保护非 Http 触发的 Azure 函数,如服务总线触发器
如何延迟读取触发 HTTP 请求的正文,直到稍后在 Azure 函数中?
如何在 azure 函数 http 触发器中触发失败,并带有自定义错误响应