У меня есть 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.
Вы видите несколько событий BlobCreated
при использовании OpenWriteAsync
, потому что метод создает большой двоичный объект в три этапа.
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.