BlobClient.OpenWriteAsync создает несколько событий BlobCreated

У меня есть AzureFunction, которая прослушивает событие BlobCreated, которое запускается при создании большого двоичного объекта в контейнере.

Когда я использую следующий код для создания большого двоичного объекта из строки, я получаю 1 сгенерированное событие BloblCreated.

    using var ms = new MemoryStream(encoding.GetBytes(content));
    ms.Position = 0;
    await blobClient.UploadAsync(ms, overwrite: true);

Но у этого есть некоторые «ненужные» использования памяти, которые будут меньше, если я буду использовать следующий синтаксис для создания моего большого двоичного объекта из моей строки содержимого.

    using var stream = await blobClient.OpenWriteAsync(overwrite: true, cancellationToken: cancellationToken);
    using var writer = new StreamWriter(stream, encoding);
    await writer.WriteAsync(content);

Проблема с последним кодом в том, что генерируется 3 события BloblCreated.

Есть ли веская причина, по которой OpenWriteAsync() генерирует 3 события, и есть ли способ «отключить» это, чтобы он генерировал только 1 событие BlobCreated.

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы видите несколько событий BlobCreated при использовании OpenWriteAsync, потому что метод создает большой двоичный объект в три этапа.

  1. Он отправляет запрос PUT для создания большого двоичного объекта.
  2. А затем отправляет запрос PUT, чтобы установить его свойства (например, метаданные).
  3. Наконец, он отправляет запрос PUT для фиксации большого двоичного объекта. Каждый из этих запросов запускает отдельное событие BlobCreated.

Что касается отключения дополнительных событий, с помощью OpenWriteAsync этого сделать нельзя.

Вы можете использовать метод UploadAsync с объектом BlockBlobUploadOptions, который указывает параметры кодирования и перезаписи. Это позволяет избежать дополнительных событий, но при этом использовать более эффективный подход к памяти.

using var stream = new MemoryStream(encoding.GetBytes(content));
await blobClient.UploadAsync(stream, new BlobUploadOptions
{
    HttpHeaders = new BlobHttpHeaders { ContentType = "text/plain" },
    Overwrite = true
});

Это создает MemoryStream из строки содержимого и использует UploadAsync с объектом BlobUploadOptions, который указывает тип содержимого и параметры перезаписи. Этот подход должен генерировать только одно событие BlobCreated.

Другой подход

Если вы хотите использовать OpenWriteAsync, вы можете отключить событие BlobCreated для первых двух этапов, установив параметр BlobRequestOptions на DisableContentMD5Validation и DisableContentCrc64Validation на true. Это отключит событие BlobCreated для первых двух этапов, и только последний этап будет генерировать событие BlobCreated.

Чтобы использовать OpenWriteAsync с BlobRequestOptions, чтобы отключить событие BlobCreated для первых двух этапов.

using var stream = await blobClient.OpenWriteAsync(overwrite: true, cancellationToken: cancellationToken, options: new BlobRequestOptions { DisableContentMD5Validation = true, DisableContentCrc64Validation = true });
using var writer = new StreamWriter(stream, encoding);
await writer.WriteAsync(content);

Для получения дополнительной информации обратитесь к MSDoc.

Другие вопросы по теме

Как переопределить время истечения срока действия по умолчанию с публикацией Azure Event Grid в очередь?
Доставка сетки событий Azure через частную конечную точку невозможна — каковы альтернативы?
Azure EventGrid перемещает события в очередь недоставленных сообщений без повторной попытки
Как отправить данные в конечную точку темы в сетке событий Azure из узла js
Неавторизованная ошибка отправки сообщения из приложения-функции в сетку событий при отладке, но нормально при запуске в Azure
Несанкционированное сообщение об ошибке отправки из приложения-функции в сетку событий с доступом на основе ролей для отправки сетки событий
Событие Центра Интернета вещей не получает обновленное записанное свойство двойника устройства Azure
Отсутствует конструктор Azure.Messaging.EventGrid и Azure.EventGrid IotHubDeviceTelemetryEventData?
Безопасность контейнера недоставленных сообщений Event Grid
Превышено значение времени ожидания, инициирующее функцию отмены Azure в Java

Похожие вопросы