Azure Функции с использованием токена отмены с триггером Http - PullRequest
1 голос
/ 13 февраля 2020

Я разрабатываю функцию в Azure с токеном отмены. Это Http Trigger.

Я передаю токен отмены в параметрах метода.

Его функция длительного выполнения. И я отменяю запрос между процессами, но процесс продолжает работать, и токен отмены не вступает в силу.

Поддерживается ли это в Azure функциях, что если я отменю запрос Http между он также должен отменить выполнение, но это не так.

Я проверил это с помощью небольшого куска кода

public static class LongRunningFunction
    {
        [FunctionName("LongRunningFunction")]
        public static async Task<IActionResult> RunAsync(
            [HttpTrigger(AuthorizationLevel.Anonymous, "get", "post",  Route = "Long")]
            HttpRequest req, ILogger log, CancellationToken token)
        {
            try
            {
                await Task.Delay(10000, token);
                return new OkResult();

            }
            catch (OperationCanceledException)
            {
                return new NotFoundResult();
            }
            catch (Exception e)
            {
                return new InternalServerErrorResult();
            }
        }
    }

И я использовал Postman для выполнения.

Я делаю что-то не так?

Я получаю помощь от следующих Ссылка

1 Ответ

1 голос
/ 13 февраля 2020

Без использования функций длительного пользования, я не думаю, что это возможно. Вот пример использования Durable:

[FunctionName("ApprovalWorkflow")]
public static async Task Run(
    [OrchestrationTrigger] IDurableOrchestrationContext context)
{
    await context.CallActivityAsync("RequestApproval", null);
    using (var timeoutCts = new CancellationTokenSource())
    {
        DateTime dueTime = context.CurrentUtcDateTime.AddHours(72);
        Task durableTimeout = context.CreateTimer(dueTime, timeoutCts.Token);

        Task<bool> approvalEvent = context.WaitForExternalEvent<bool>("ApprovalEvent");
        if (approvalEvent == await Task.WhenAny(approvalEvent, durableTimeout))
        {
            timeoutCts.Cancel();
            await context.CallActivityAsync("ProcessApproval", approvalEvent.Result);
        }
        else
        {
            await context.CallActivityAsync("Escalate", null);
        }
    }
}

https://docs.microsoft.com/en-us/azure/azure-functions/durable/durable-functions-overview?tabs=csharp#human

...