Кнопка Swagger Cancel должна вызывать CancellationSource - PullRequest
0 голосов
/ 01 мая 2020
[ApiController]
[Route("[controller]")]
public class JobController : ControllerBase
{
    private readonly IEventBus _bus;

    public JobController(IUnitOfWork unitOfWork, IEventBus bus)     
    {
        _bus = bus;
    }
    ...

    [HttpPost]
    public async Task<IActionResult> Post([FromBody]JobRequest request)
    {
        try
        {
            var command = new JobCommand{ Id = 1, Name = "abc"};
            await _bus.SendCommand(command);
        }
        catch (OperationCanceledException)
        {
            _logger.LogInformation("Task was cancelled!");
        }

        return CreatedAtAction(nameof(GetById), new { id = 0 }, null);
    }
}

public class JobCommandHandler : IRequestHandler<JobCommand, bool>
{
    private readonly ILogger<JobCommandHandler> _logger;
    public JobCommandHandler(ILogger<JobCommandHandler> logger)
    {
      _logger = logger;
    }

    public async Task<bool> Handle(JobCommand request, CancellationToken cancellationToken)
    {
        //
        // I was able to reproduce manual cancellation by using this code below

        var cts = new CancellationTokenSource();
        cts.Cancel();
        cancellationToken = cts.Token;

        // how this can be populated sent from the place where I'm issuing command?
        cancellationToken.ThrowIfCancellationRequested();
        ... 
        // long running task
    }
}

Мой вопрос: нужно ли отправлять CancellationTokenSource вместе с командой? Если это так, как вызвать это с помощью кнопки отмены swagger, и рекомендуется ли включать CancellationTokenSource в свойство класса CommandBase, которое будет расширяться каждые Command?

1 Ответ

0 голосов
/ 01 мая 2020

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

Вы можете получить токен отмены запроса от HttpContext в контроллере от HttpContext.RequestAborted.

Теперь, в вашем примере я не уверен, что такое IEventBus. Если это какой-то распределенный сервер обмена сообщениями, простая передача CancellationToken не будет работать, в этом случае вы можете отправить событие отмены, чтобы отменить действие, которое я предполагаю.

Если это только события в памяти , тогда это, вероятно, должно работать.

...