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

Jam*_*mes 5 c# azure cancellationtokensource cancellation-token azure-functions

当我取消从浏览器到 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");
}
Run Code Online (Sandbox Code Playgroud)

我一直在通过 Postman 和 axios 取消令牌测试取消。当我在本地运行项目并取消它时,它可以工作,但一旦发布到天蓝色,它似乎就不会取消。

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

重现步骤:

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

小智 1

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