Отменить длительную операцию с Angular на .NET Core

#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, так что теперь, когда пользователь меняет маршрут, все соединения получают отмену, и это закрывает поток, если реализовано.