У меня есть приложение ASP.NET MVC, которое взаимодействует с внешними ресурсами, и есть операция, которая занимает много времени.Так что в контроллере у меня есть метод, подобный этому
[HttpPost]
public async Task<JsonResult> SomeMethod(..., CancellationToken token)
{
await _someService.ExecuteSlowOperationAsync(..., token);
...
}
И эта медленная операция выглядит как
public async Task ExecuteSlowOperationAsync(..., CancellationToken token)
{
return await Task.Run(() =>
{
//interacting with external resource
}, token);
}
Этот метод связан с модальным представлением, и если запрос займет так много времени, пользователь может решитьзакрой его.В соответствии с этим я должен отменить запрос, не ожидая результатов, поэтому на стороне клиента у меня есть код вроде
...
var request = $.ajax(...);
...
$('#modal').on('hidden.bs.modal', function () {
request.abort();
});
Если я правильно понял article , токен отмены связывается с запросом через frameworkмодель связующего и не нужно что-то с ней делать.Когда пользователь закрывает модальную форму, в браузере консоли я вижу, что запрос получает статус «отменен», но на стороне сервера медленная работа все еще выполняется.Также я попробовал с
CancellationToken disconnectedToken = Response.ClientDisconnectedToken;
var source = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken, disconnectedToken);
, а затем взял токен из этого источника, но все равно ничего не получил.
Я чувствую, что упускаю какую-то важную вещь и неправильно понимаю эту ситуацию.Есть идеи, как заставить это работать?