Azure函数的HTTP触发器无法取消请求

5

当我在Azure上托管时,从浏览器向HTTP触发器发送请求后,取消请求不起作用,函数将继续执行。

我的函数示例:

[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。这样做会取消你的函数吗? - Peter Csala
你正在运行哪个版本的Azure Functions? - Sebastian Achatz
1
@PeterCsala 我做了以下更改:https://gist.github.com/Jamess-Lucass/533ec5524d82d02886a5be67a46d00b0,取消请求后似乎仍在执行。 - James
@SebastianAchatz 我正在使用 Azure Functions v3。 - James
@James,我这里正在运行一个v3函数,使用'request.HttpContext.RequestAborted',对我来说它很好用。但是我没有通过注入的CT并使用CancellationTokenSource.CreateLinkedTokenSource来合并主机取消。你能否尝试检查一下这是否适用于你? - Sebastian Achatz
@SebastianAchatz 我已经将所有令牌切换到“req.HttpContext.RequestAborted”,但仍然没有运气。本地仍会取消请求,但在 Azure 上不会。如果这有什么区别的话,我是在消费计划上,不太确定还有什么其他区别。 - James
1个回答

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接