【问题标题】:Azure function HTTP Trigger not cancelling requestAzure函数HTTP触发器未取消请求
【发布时间】: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 上的日志时,似乎只是继续执行并完成该功能。

重现步骤:

  1. 创建一个类似于上面定义的 HTTP 触发器。
  2. 将应用发布到 Azure。
  3. 在监控部分打开 Azure 上的函数日志。
  4. 使用 Postman 向该函数发送请求并取消请求(在 30 秒的超时时间内)。
  5. 不会取消请求,仍会执行。

【问题讨论】:

  • 您是否尝试过执行以下操作? (这只是为了试验)而不是有一个 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。您可以尝试检查这是否适合您吗?

标签: c# azure azure-functions cancellationtokensource cancellation-token


【解决方案1】:

CancellationToken 有助于实现 Functions 运行时主机的正常关闭,当操作系统通知它出现问题以终止它时,请参阅以下答案了解更多信息:https://stackoverflow.com/a/63439515/528779

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-18
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多