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

  • 6 сентября 2023 г. 12:26
Ответы на вопрос 2
Для привязки CancellationToken к контроллерам в ASP.NET Core можно использовать параметр CancellationToken в методе действия контроллера.

Вот пример кода, который объяснит, как привязать CancellationToken к методам контроллера:

```csharp
[HttpPost]
public async Task<IActionResult> EditEmployeeAttestation(int id, CancellationToken cancellationToken)
{
    //...
    await _employeesService.EditEmployeeAttestation(id, cancellationToken);
    //...
    return Ok();
}
```

В данном примере параметр `cancellationToken` будет автоматически привязан к токену отмены текущего HTTP-запроса.

Когда вы добавляете асинхронность в метод `_employeesService.EditEmployeeAttestation`, вы можете использовать `cancellationToken` для передачи его дальше по цепочке вызовов:

```csharp
public async Task EditEmployeeAttestation(int id, CancellationToken cancellationToken)
{
    //...
    await SomeAsyncOperation(cancellationToken);
    //...
}
```

Если запрос будет отменен, то токен отмены будет прокинут во все вызываемые методы, которые его поддерживают. Если `SomeAsyncOperation` поддерживает отмену с помощью CancellationToken, то оно будет отменено, когда токен отмены будет отменен.

Таким образом, при добавлении async/await с передачей CancellationToken, значение токена будет прокинуто во все вызываемые методы, которые его поддерживают.
- Используйте `HttpContext.RequestAborted`, чтобы получить `CancellationToken`, если боитесь его передавать через аргументы.
- Рантайм автоматически подставляет `CancellationToken` через процесс под названием "model binding". Подробнее можно прочитать здесь: [ссылка на документацию](https://learn.microsoft.com/en-us/aspnet/core/mvc/...).
- Биндинг выполняется исключительно на основе соответствия типа, имя аргумента не имеет на него влияния.
Похожие вопросы