Как в контроллеры привязывается CancellationToken?

В C#, CancellationToken является механизмом для отмены операции, который позволяет управлять выполнением потоков и задач. Привязка CancellationToken к контроллерам позволяет получать уведомления об отмене запроса и прервать выполнение запроса, если он был отменен.

Для привязки CancellationToken к контроллерам в ASP.NET Core, сначала необходимо добавить CancellationToken как параметр метода в контроллере. Это можно сделать путем добавления параметра типа CancellationToken в методы контроллера.

[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
    [HttpGet]
    public async Task<IActionResult> MyMethod(CancellationToken cancellationToken)
    {
        // ваш код здесь
        // использование cancellationToken для проверки отмены запроса
        if (cancellationToken.IsCancellationRequested)
        {
            return StatusCode(StatusCodes.Status400BadRequest, "Запрос был отменен");
        }

        // продолжение выполнения метода, если запрос не был отменен
        // ...
    }
}

Теперь, при каждом вызове этого метода контроллера, ASP.NET Core автоматически передает CancellationToken в качестве параметра метода. Вы можете использовать этот CancellationToken для проверки, был ли запрос отменен, и выполнить дополнительную логику в соответствии с этим.

Если запрос был отменен, вы можете вернуть соответствующий результат, чтобы информировать клиента об отмене запроса.

Важно отметить, что привязка CancellationToken к контроллерам предоставляет только уведомления об отмене запроса на уровне метода контроллера. Если вам нужно отменить выполнение долгой операции на уровне бизнес-логики, вам необходимо вручную передавать CancellationToken в соответствующие асинхронные методы.

public class MyService : IMyService
{
    public async Task DoLongRunningOperation(CancellationToken cancellationToken)
    {
        // ваш код здесь
        // использование cancellationToken для проверки отмены операции
        if (cancellationToken.IsCancellationRequested)
        {
            throw new OperationCanceledException();
        }

        // продолжение выполнения операции, если она не была отменена
        // ...
    }
}

public class MyController : ControllerBase
{
    private readonly IMyService _myService;

    public MyController(IMyService myService)
    {
        _myService = myService;
    }

    [HttpGet]
    public async Task<IActionResult> MyMethod(CancellationToken cancellationToken)
    {
        try
        {
            await _myService.DoLongRunningOperation(cancellationToken);
            return Ok();
        }
        catch (OperationCanceledException)
        {
            return StatusCode(StatusCodes.Status400BadRequest, "Операция была отменена");
        }
    }
}

Это позволяет централизованно управлять отменой операций на уровне бизнес-логики, вне зависимости от требований контроллера.