it-swarm.com.ru

Как загрузить большой файл через функцию Azure?

Я изучаю функции Azure. Сценарии, которые я тестировал до сих пор, прекрасно работают.

Сейчас я пытаюсь найти способ загрузки файлов (более 20 МБ) с помощью функции Azure. 

Идея заключается в том, что функция Azure сначала проверит, разрешено ли аутентифицированному пользователю загружать файл, прежде чем удерживать поток запроса и сохранять его в хранилище больших двоичных объектов.

Вот код со стороны клиента, который создает StreamContent для передачи байтов на сервер: 

using (Stream fileStream = ...)
{
    var streamContent = new StreamContent(fileStream);

    streamContent.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
    streamContent.Headers.ContentLength = fileStream.Length;
    streamContent.Headers.Add("FileId", fileId);

    var responseMessage = await m_httpClient.PutAsync(<validURI>, streamContent);

    responseMessage.EnsureSuccessStatusCode();

    succeeded = true;
}

Вот код на стороне сервера.

[FunctionName("upload-data")]
public static async Task<HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Function, "put")]HttpRequestMessage req, TraceWriter log)
{
    try
    {
         //  Initialize stuff.

         //  Validate authenticated user & privileges.  

         //  Get the content stream of the request and 
         //  save it in the BLOB storage.

         return req.CreateResponse(HttpStatusCode.OK);
    }
    catch (Exception exc)
    {
        return req.CreateResponse(HttpStatusCode.InternalServerError, exc);
    }
}

Я ставлю точку останова прямо в начале метода. Я ожидал, что точка останова будет достигнута сразу после того, как клиентская сторона отправит запрос, независимо от размера файла. Однако это не так. 

Я предполагаю, что функция Azure каким-то образом пытается получить все содержимое тела запроса перед вызовом метода. Я также думаю, что отправляю файл, размер которого может превышать 4 МБ основного веб-задания, но я не нашел способа его настройки.

Можно ли загрузить большой файл в функцию Azure путем его потоковой передачи? Есть ли способ заставить это работать?

8
Kzrystof

Я нашел другой способ делать вещи. Вот решение, которое работает для меня.

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

Функция Azure запросит подпись общего доступа для доступа к определенному BLOB-объекту. SAS предоставит клиенту доступ к хранилищу BLOB-объектов с правами только для записи в течение ограниченного времени (следите за перекосом часов в Azure).

Затем клиент будет использовать возвращенный SAS для загрузки файла непосредственно в хранилище BLOB-объектов. Таким образом, это позволяет избежать долгосрочного общения с клиентом, как упомянул Афзаал Ахмад Зеешан, и еще больше снижает общую стоимость, поскольку функция Azure больше не зависит от скорости соединения клиента.

7
Kzrystof

Вы следите за плохой практикой здесь, Kzrystof. Функции Azure не предназначены для долгосрочной связи с клиентскими устройствами. Я не уверен, почему кто-то может быть заинтересован в том, чтобы направить вас на написание программы для управления функцией Azure и заставить ее делать то, для чего она не предназначена. 

Большие длительные функции могут вызвать непредвиденные проблемы с тайм-аутом.

Теперь представьте, что у вас может быть хорошее интернет-соединение, но пользователи могут и не иметь. Есть несколько других проблем, которые вы должны принять к сведению, прежде чем что-либо. И это выдержка из официальной документации, https://docs.Microsoft.com/en-us/Azure/azure-functions/functions-best-practices

Если бы мне пришлось разрабатывать это приложение, я бы использовал Сервис приложений → Хранилище Azure → Функции Azure. Это будет рабочий процесс архитектуры моего приложения.

В подходе к дизайну мои приложения будут обрабатывать эту информацию по очереди, например, служба приложений может позаботиться о загрузке изображения, и там я могу указать, может ли пользователь загружать или нет. ASP.NET Core или любой другой язык или инфраструктуру можно использовать для разработки этой стороны веб-приложения, и вы знаете, что это может быть легко повышено для поддержки загрузки файлов до 20 МБ.

Почему я попросил тебя крутить дизайн? У вас была функция для Blob, и я предлагаю функцию Blob для функции, потому что, 

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

Сами функции должны быть без сохранения состояния, что означает, что они не должны хранить какую-либо информацию о чем-либо, и для их решения вам потребуется другое промежуточное программное обеспечение (или frontware) для связи с серверами Identity, поэтому я предлагаю используйте здесь Службу приложений, так как она может содержать необходимую информацию для аутентификации пользователей, а затем Blob и, наконец, Function & rarr, при необходимости.

Затем, как только он выйдет оттуда, в хранилище Azure, я смогу получить WebHooks или прямые триггеры хранилища BLOB-объектов, чтобы позаботиться о делегировании оттуда и обработать образ в функции Azure - если есть необходимость в функции больше. Посмотрите, как триггер хранилища BLOB-объектов можно использовать для запуска функции для различных целей, https://docs.Microsoft.com/en-us/Azure/azure-functions/functions-create-storage-blob- Триггер-функция .

4
Afzaal Ahmad Zeeshan

Как только вы установите заголовок ContentLength, вы больше не будете его передавать. Вам нужно использовать класс PushStreamContent и записывать в поток кусками.

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

1
Darrel Miller