Как ASP.NET сообщает UploadProgress? - PullRequest
4 голосов
/ 29 мая 2019

На основании этого вопроса и ответа Загрузка ASP.NET Core 2.0 и Angular 4.3 с прогрессом

ASP.NET возвращает HTTP-события - процесс загрузки и окончательный ответ:

[HttpPost, DisableRequestSizeLimit, Route("api/files")]
public async Task UploadFiles()
{
    var files = Request.Form.Files; // now you have them
}

И Angular принимает ответ (ы) и обрабатывает, что:

this.http.request(req).subscribe(event => {
            if (event.type === HttpEventType.UploadProgress)
                this.uploadProgress = Math.round(100 * event.loaded / event.total);
            else if (event instanceof HttpResponse)
                console.log('Files uploaded!');
        });

Мои вопросы:

1) Какая часть приведенного выше кода ASP.NET говорит о том, что он должен отвечать на UploadProgress до завершения процесса загрузки? Откуда он знает, что это запрос, который должен ответить на UploadProgress? Где находится код в исходном коде ASP.NET, который возвращает UploadProgress? (https://github.com/aspnet/AspNetCore)

2) Общий поток, это спецификация HTTP? Очевидно, что есть правило, и я пока не могу найти какую-либо документацию по нему.

1 Ответ

2 голосов
/ 29 мая 2019

Какая часть приведенного выше кода ASP.NET говорит о том, что он должен ответить UploadProgress

Ничего из этого.ASP.NET Core этого не делает.

  • HttpPost означает, что вы хотите принимать данные в форме запроса POST.
  • DisableRequestSizeLimit означает, что вы неЯ не хочу, чтобы ASP.NET Core блокировал загрузку файлов сверх предопределенного предела (я думаю, 30 МБ).
  • Route определяет URL-адрес для маршрута.

Общий поток, это спецификация HTTP?Очевидно, что есть правило, и я пока не могу найти какую-либо документацию по нему.

Нет, это не так.Это необязательно.Клиент знает, сколько данных он успешно отправил, и отсюда происходит прогресс.

Библиотека Angular HTTP построена на XMLHttpRequest, в которой есть событие Progress:

Обработчик события прогресса, указанный в этом примере функцией updateProgress (), получает общее количество байтов для передачи, а также количество байтов, переданных на данный момент в событии события.Всего и загруженных полей.Однако, если поле lengthComputable имеет значение false, общая длина неизвестна и будет равна нулю.

Существуют события хода выполнения для передач как загрузки, так и передачи.События загрузки инициируются самим объектом XMLHttpRequest, как показано в приведенном выше примере.События загрузки запускаются для объекта XMLHttpRequest.upload ...

Таким образом, библиотека Angular HTTP просто подключается к событиям прогресса локального объекта запроса, а затем предоставляет их вам в более удобной форме..

...