Асинхронный прогресс в промежуточном программном обеспечении ASP .NET Core? - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть web-api с mvc, который выполняет кучу инициализации при запуске, которая займет несколько минут. Я хочу, чтобы URL отвечал на запрос в течение этого времени с индикатором прогресса. Я думал об использовании промежуточного программного обеспечения для достижения чего-то вроде этого:

public async Task Invoke(HttpContext httpContext)
{
  await httpContext.Response.WriteAsync("Loading...");

  await Task.Delay(5000); // the initialization-stuff (which is not started here but just waited on)

  httpContext.Response.Clear();

  await _next(httpContext); // continue to my MVC-page
}

Однако, похоже, это не работает (ERR_INCOMPLETE_CHUNKED_ENCODING). Как правильно очистить / сбросить ответ, чтобы я мог написать новый реальный ответ после завершения инициализации.


Вместо этого я прибегнул к чему-то вроде этого (достаточно хорошо):

public async Task Invoke(HttpContext httpContext)
{
  if (!task.IsCompleted)
    await httpContext.Response.WriteAsync("Loading...");
  else
    await _next(httpContext); // continue...
}

1 Ответ

0 голосов
/ 08 ноября 2018

После отправки данных клиенту вы не можете их вернуть. Вы не можете заменить существующую страницу, только добавить.

Таким образом, вы можете сделать две вещи:

  1. Вы задерживаете ответ до завершения инициализации (вероятно, неосуществимо).
  2. Вы отправляете что-то еще и заканчиваете запрос. Вы можете сделать так, чтобы отправляемая страница опрашивала сервер с помощью AJAX, чтобы узнать, была ли инициализация завершена. Затем страница может перезагрузиться.

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

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