【发布时间】: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。您可以尝试检查这是否适合您吗?
标签: c# azure azure-functions cancellationtokensource cancellation-token