C# Azure函数HTTP触发器未取消请求
当我取消从浏览器到HTTP触发器的请求时,它不会取消,并在Azure上托管时继续执行 我的函数示例:C# Azure函数HTTP触发器未取消请求,c#,azure,azure-functions,cancellationtokensource,cancellation-token,C#,Azure,Azure Functions,Cancellationtokensource,Cancellation Token,当我取消从浏览器到HTTP触发器的请求时,它不会取消,并在Azure上托管时继续执行 我的函数示例: [FunctionName("Test")] public async Task<IActionResult> Run( [HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = null)] HttpRequest req, CancellationToken canc
[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");
}
[函数名(“测试”)]
公共异步任务运行(
[HttpTrigger(AuthorizationLevel.Anonymous,“get”,Route=null)]HttpRequest请求,
CancellationToken CancellationToken,
ILogger日志)
{
var allCancellationTokens=CancellationTokenSource.CreateLinkedTokenSource(cancellationToken,req.HttpContext.RequestAborted);
等待任务。延迟(30000,allCancellationTokens.Token);
if(allCancellationTokens.IsCancellationRequested){
log.LogInformation(“请求已取消!”);
返回新的StatusCodeResult(499);
}
返回新的OkObjectResult(“完成”);
}
我一直在通过邮递员和axios取消代币测试取消。
当我在本地运行项目并取消它时,它可以工作,但在发布到azure后似乎不会取消
我的预期结果是,如果我在wait Task.Delay(30000,allCancellationTokens.Token)期间取消请求,它将抛出一个OperationCanceledException
然而,当检查Azure函数上的日志时,似乎只是继续执行并完成函数
复制步骤:
创建一个类似于上面定义的HTTP触发器
将应用程序发布到Azure
在monitor部分中打开Azure上的函数日志
使用Postman向此函数发送请求并取消请求(在30秒的超时时间内)
不会取消请求,但仍将执行
CancellationToken
有助于在操作系统通知您的函数运行时主机出现问题并终止它时实现正常关机,有关更多信息,请参阅以下答案:您是否尝试执行以下操作?(这只是为了实验)不要有一个30秒的延迟,而是有六个5秒的延迟。在每次延迟之间调用allCancellationTokens.Token.ThrowIfCancellationRequested
。这会取消你的功能吗?你运行的是哪个版本的Azure功能?@PeterCsala我做了以下更改:在取消功能后,它似乎仍在执行request@SebastianAchatz我正在使用Azure函数v3@James我在这里使用'request.HttpContext.RequestAborted'运行了一个v3函数,它对我来说运行良好。但是我没有通过注入的CT和doing CancellationTokenSource.CreateLinkedTokenSource合并主机取消。你能检查一下这是否对你有效吗?