Индикатор выполнения API с ASP. NET Core 3.1 и axios - PullRequest
0 голосов
/ 05 мая 2020

У меня есть давно работающий ASP. NET Core API, который я хотел бы представить в виде индикатора выполнения в пользовательском интерфейсе.

Со стороны сервера я знаю, сколько заданий будет выполнено из самое начало. Скажем, если у меня есть 10 заданий, и каждое задание занимает секунду, это будет 10-секундный индикатор выполнения.

Лучшее, что я смог найти, было https://github.com/DmitrySikorsky/AspNetCoreUploadingProgress, но оно зависит от экономии прогресс по запуску. Прогресс, который равен stati c int. Разве это не значит, что во всем веб-приложении может быть только один сеанс загрузки за раз?

Интересно, могу ли я сделать это с помощью ax ios call:

return axios.post(
    '/api/long-running-task',
    {},
    {
      onUploadProgress: function(progressEvent) {
        console.log("upload", progressEvent.loaded, progressEvent.total);
      },
      onDownloadProgress: function(progressEvent) {
        console.log("download", progressEvent.loaded, progressEvent.total);
      }
    }
  );

И если я сделаю что-то правильно со стороны ASP. NET Core, смогу ли я связаться с ax ios и запустить либо onUploadProgress, либо onDownloadProgress?

Что я пробовал:

[HttpPost]
[Route("long-running-task")]
public async Task<ActionResult> Run()
{
    Response.StatusCode = 200;
    Response.ContentType = "text/plain";
    Response.ContentLength = 10;

    var sw = new StreamWriter(Response.Body);

    for (var i = 0; i < 10; i++)
    {
        await Task.Delay(1000);
        await sw.WriteAsync("1");
        await sw.FlushAsync();
    }
    return null;
}

ax ios записывает один upload журнал вскоре после этого, а затем один download журнал через 10 секунд. Промежуточный прогресс не получен.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Я нашел способ выполнить эту работу: укажите ContentType равным text/event-stream.

Я считаю, что это меняет поведение кэширования на стороне сервера, поэтому оно должно работать в любых браузерах, поскольку поддерживается ax ios . Подтверждена работа с Chrome 81, Edge 44 и IE 11.

[HttpPost]
[Route("long-running-task")]
public async Task<ActionResult> Run()
{
    Response.StatusCode = 200;
    Response.ContentType = "text/event-stream";
    Response.ContentLength = 10;

    var sw = new StreamWriter(Response.Body);

    for (var i = 0; i < 10; i++)
    {
        await Task.Delay(1000);
        await sw.WriteAsync("1");
        await sw.FlushAsync();
    }
    return Ok();
}

EDIT: в конце верните Ok () вместо null. Если у вас нет заданий, возврат null вызовет исключение.

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

Статус загрузки и выгрузки не поможет вам с вашей задачей, так как это будет зависеть от размера запроса.

Все, что вам нужно сделать, это asp. net основная сторона:

  1. Создайте job/start api, который возвращает вам какой-то ключ
  2. job/progress/id api, который скажет вам, насколько вы продвинулись

Затем внутри вашего топора ios вызовите начало работы, получите идентификатор, затем каждые N секунд вызовите статус, чтобы узнать, насколько продвинулась ваша работа.

Другой вариант, посмотрите на шаги signalR, будут такими же, только вам не нужно будет вызывать status api каждые N секунд сможет вернуть sh с сервера статус вашей работы.

...