#c# #angular #asp.net-core #abp
#c# #angular #asp.net-core #abp
Вопрос:
Я пытаюсь отправить запрос на отмену (на c # AspNetCore на основе шаблона Abp) из Angular client (используйте Observable -> unsubscribe …), чтобы отменить длительную операцию задачи, но API не срабатывает.
[HttpPost]
public async Task<GetDataOutputDto> GetDataLongOperation(CustomInputDto input)
{
try
{
var tokenSource = new CancellationTokenSource(); // _httpContextAccessor.HttpContext.RequestAborted;
tokenSource.CancelAfter(2500);
var token = _httpContextAccessor.HttpContext.RequestAborted; //tokenSource.Token;
var settings = new JsonSerializerSettings
{
Error = (sender, args) => {
args.ErrorContext.Handled = true;
},
MissingMemberHandling = MissingMemberHandling.Ignore
};
//... remove for brev
}
на стороне angular
this.subscription = this.loadData(undefined).subscribe(res=>{
console.log('data loaded!');
this.localData = res.data;
//this._rawData = this.localData;
this.loadItems();
});
setTimeout(() => {
console.log('TEST stop long')
this.subscription.unsubscribe();
}, 2500);
Я проверяю, что если я использую TaskSource с CancelAfter, весь код позади работает хорошо, но из Интернета (на стороне клиента) Я не могу запустить операцию отмены
Комментарии:
1. Это может помочь davepaquette.com/archive/2015/07/19 /…
Ответ №1:
Вы можете добавить CancellationToken в качестве параметра действия вашего контроллера, вам не нужно создавать CancellationTokenSource в вашем контроллере. Этот токен будет отменен, когда HTTP-запрос будет отменен путем отмены подписки в angular.
[HttpPost]
public async Task<GetDataOutputDto> GetDataLongOperation(CustomInputDto input, CancellationToken token)
{
try
{
var settings = new JsonSerializerSettings
{
Error = (sender, args) => {
args.ErrorContext.Handled = true;
},
MissingMemberHandling = MissingMemberHandling.Ignore
};
}
catch(TaskCanceledException e)
{
//The observable was unsubscribed in angular
}
Комментарии:
1. Похоже, что при отмене запроса не вводится catch, при использовании
token.ThrowIfCancellationRequested()
он выдаетOperationCanceledException
.2. Да, отмена запроса не приводит к автоматическому возникновению исключения. Длительная операция должна выполняться при отмене токена отмены. Если ваша операция использует методы framework для доступа к базе данных или файловой системе, вы можете использовать токен в качестве параметра этих методов. Если ваша операция представляет собой вычисление, выполняемое в вашем коде, вы можете добавить
token.ThrowIfCancellationRequested()
в свой код (например, внутри основного цикла), чтобы он выполнялся при отмене запроса
Ответ №2:
Я нашел решение, все зависит от того, каким образом Angular закрывает / отменяет соединение.
Я использую это решение angular-как-отменить-http-вызовы-на-маршрутизаторе-изменить angular-как-отменить-http-вызовы-на-маршрутизаторе-изменить
Я поместил ее в root.module.ts, так что теперь, когда пользователь меняет маршрут, все соединения получают отмену, и это закрывает поток, если реализовано.