Azure 函数 HTTP 触发器未取消请求

问题描述

当我取消从浏览器到 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 似乎就不会取消。

我的预期结果是,如果我在 OperationCanceledException 期间取消请求,它会抛出 await Task.Delay(30000,allCancellationTokens.Token); 但是在检查 Azure Functions 上的日志时,似乎只是继续执行并完成该功能。>

重现步骤:

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

解决方法

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...