Mvc прогресс асинхронной операции с использованием вызова ajax - PullRequest
0 голосов
/ 26 января 2019

На моем сервере выполняется длительная операция POST

[HttpPost]
        public async Task<ActionResult> LongOperation()
        {
            var s = (int)System.Web.HttpContext.Current.Session["p"];
            IProgress<int> progress = new Progress<int>(value => s = value);

            await Task.Run(() =>
                    {
                        Task.Delay(2000);
                        progress.Report(33);
                    })
                   .ContinueWith(prevTask =>
                   {
                       Task.Delay(2000);
                       progress.Report(66);
                   })
                    .ContinueWith(prevTask =>
                    {
                        Task.Delay(2000);
                        progress.Report(100);
                    });

            return View("Index", new TempModel());
        }

Я пытаюсь отслеживать его выполнение методом GET

public ContentResult GetProgress()
        {
            var session = (int)System.Web.HttpContext.Current.Session["p"];
            return Content(session.ToString());
        }

Мой jQuery вызывает первый запрос POST..

this.Submit = function(){
  $.post("@Url.Action("LongOperation", "MyController")", function (response) {

 }
}

... и периодический мониторинг прогресса

 this.PollServerForProgress = function PollServerForProgress() {


                $.get("@Url.Action("GetProgress", "MyController")", function (response) {

                    console.log(response);


                        setTimeout(that.PollServerForProgress, 100);
                    }

                })
            }

Однако, Submit и PollServerForProgress, кажется, происходят последовательно.

Я всегда получаю ответ от PollServerForProgress как 1 -- iniial value или 100 -- final value, а не 1, 33, 66, 100, как я ожидаю.

Ответы [ 2 ]

0 голосов
/ 26 января 2019

Кажется, что Submit и PollServerForProgress происходят последовательно.

Да.Доступ к сеансу защищен механизмом чтения / записи.Если у вас есть запрос, который имеет доступ для записи в сеанс, то это предотвращает любые другие запросы, входящие в тот же сеанс.Это специально.

Как указано usr , один из вариантов - сохранить данные о ходе выполнения вне сеанса.В качестве альтернативы вы можете изменить это на что-то вроде вызова SignalR, который более гибок в том, что сервер может вызывать клиента с обновлениями прогресса.

0 голосов
/ 26 января 2019

Запись сеанса не сохраняется немедленно.Сеанс сохраняется в конце запроса.Это хорошо для производительности.

Я не уверен, что есть способ прямой записи в сеанс.У меня нет особого опыта в этом.

Вы можете записать информацию о прогрессе в какое-то постоянное хранилище данных, такое как база данных (или redis или даже какой-то другой кеш).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...