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 触发器中触发失败,并带有自定义错误响应

如何确定 Webhook 未触发 Azure Function App 的原因

Azure HTTP 触发函数调用返回 417 错误代码