Загрузить большой файл asyn c без его утилизации - PullRequest
0 голосов
/ 26 января 2020

Я создаю. NET Core 3.1 WEB API, который получит большой файл (до 500 МБ), если он действителен, вернет клиенту ответ 200 и только после этого загрузит загруженный файл в Azure Контейнер BLOB-объектов.

Проблема, с которой я столкнулся, заключается в том, что запрос / поток удаляется (я полагаю) после того, как я возвращаю ответ клиенту, и он не выдает мне ни ошибок, ни загружено ли оно.

Я пробовал несколько альтернатив, но безуспешно:

  • Task.Run ()
  • Блокировка потока,
  • Копирование потока в новую переменную
  • Синхронизация потока,
  • Служба размещения с фоновой очередью

Единственный способ успешно загрузить файл - это если либо я сохраняю файл локально, либо заставляю пользователя ждать, но я бы не стал этого делать, если смогу.

У кого-нибудь есть идеи, как я могу выполнить sh это?


РЕДАКТИРОВАТЬ:

Я создаю ресурс в базе данных с опцией загрузки файла (и возвращает 202 с идентификатором операции загрузки файла), и я обновляю его статус в зависимости от успешности загрузки в Azure хранилище BLOB-объектов.

Пользователь может проверить состояние загрузки в другом API конечная точка.

Я просто хотел бы знать, существует ли способ сохранить файловый поток или какой-либо объект на самом деле после возврата ответа.

Ответы [ 3 ]

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

Если браузер предоставил заголовок Expect: Continue. Затем вы можете отклонить запрос на основе предоставленных заголовков запроса, прежде чем клиент отправит какие-либо данные файла. Или затем ответьте с помощью продолжения 100 и прочитайте данные файла.

Однако, если вы хотите сохранить данные этого файла, вам придется скопировать их куда-нибудь, прежде чем вы сможете вернуть код состояния клиенту. В память, на локальный диск или потоковую передачу до внутреннего контейнера BLOB-объектов. Так работает HTTP.

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

Единственный способ успешно загрузить файл - это если я сохраню файл локально или заставлю пользователя ждать

Вы можете скопировать поток в MemoryStream и передать его фоновый процесс для загрузки. Но это займет много памяти и не выдержит перезапуск приложения.

Копирование потока в локальный файл и передача его в фоновый процесс, по крайней мере, не займет 500 МБ памяти на запрос, и может быть сделано, чтобы пережить перезапуск приложения.

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

У вашего вопроса есть фундаментальная проблема ....

, если она верна, верните клиенту ответ 200 и только после этого загрузите загруженный файл в контейнер Azure Blob. .

Существует целый ряд случаев, когда это приводит к тому, что клиент получает 200, а вы не загружаете его в контейнер блога, поэтому 200 - это ie. Таким образом, вы не должны делать это таким образом, ПЕРИОД. Итак, вопрос спорный.

Кроме того, вы не можете этого сделать, потому что asp. net будет распоряжаться файлом, который вы получили, потому что именно так работает asp. net. - переменная является частью контекста запроса и, таким образом, расположена в конце.

...