Azure BlobBatchClient.DeleteBlobsAsync всегда возвращает 404 больших двоичных объекта, которые не найдены

#c# #azure #azure-blob-storage

Вопрос:

Я испытываю очень странное поведение при попытке выполнить пакетное удаление больших двоичных объектов в контейнере. Наличие следующего кода (обратите внимание, что часть кода опущена или отредактирована по соображениям краткости и безопасности):

 var blobServiceClient = GetAzureBlobServiceClient();
var container = await BuildAzureContainer(blobServiceClient);

var blobsToBeDeleted = new List<Uri>();

var thumbImage = removedMedia.Path.GetThumbImageName();
blobsToBeDeleted.Add(new Uri("https://account-name.blob.core.windows.net/container-name/blob-name"));

if (!string.IsNullOrEmpty(thumbImage))
{
    blobsToBeDeleted.Add(new Uri("https://account-name.blob.core.windows.net/container-name/thumbs/blob-name"));
}

if (blobsToBeDeleted.Any())
{
    var batch = blobServiceClient.GetBlobBatchClient();
    await batch.DeleteBlobsAsync(blobsToBeDeleted, DeleteSnapshotsOption.IncludeSnapshots);
}
 

Использование Azure.Storage.Blobs (12.9.0) и Azure.Storage.Blobs.Batch (12.6.0)
Прямо перед тем, как я попытаюсь выполнить пакетное удаление, я загружаю изображения в Azure и подтверждаю, что они загружены и существуют в контейнере. Ответ от Azure таков:

 System.AggregateException: 2 batch operation(s) failed. (The specified blob does not 
exist.
RequestId: **removed**
Time:2021-06-18T08:16:15.2409894Z
Status: 404 (The specified blob does not exist.)
ErrorCode: BlobNotFound
 

Попытался также получить Uri с помощью:

 container.GetBlobClient("blob-name").Uri
 

или

 container.GetBlobClient("thumbs/blob-name}").Uri
 

который также возвращает правильный URL-адрес, но безуспешно.

Я проверил, и URL-адреса, которые я добавляю в список, точно совпадают с активными в Azure. Независимо от того, что я делаю, ответ один и тот же — все пакетные операции возвращаются BlobNotFound . Например, если сделать следующее с тем же большим двоичным объектом:

 BlobClient blob = container.GetBlobClient("container-name/blob-name");
await blob.DeleteAsync(DeleteSnapshotsOption.IncludeSnapshots);
 

Большой двоичный объект успешно удален. Я действительно борюсь с этим и не могу найти причину такого поведения, особенно когда я могу удалить один и тот же большой двоичный объект, но не в пакете. Я что-то упускаю или что-то происходит с SDK?
Решил написать здесь, прежде чем открывать новый выпуск на GitHub.

Любая помощь была бы очень признательна.

P.S. Я уверен, что это работало пару месяцев назад, и единственное, что изменилось, — это обновления пакетов NuGet.

Комментарии:

1. Я только что поднял здесь вопрос: github.com/Azure/azure-sdk-for-net/issues/24093 .

Ответ №1:

Я провел несколько тестов со своей стороны, если вы укажете DeleteSnapshotsOption.IncludeSnapshots для batch.DeleteBlobsAsync удаления больших двоичных объектов, у которых нет моментального снимка, вы получите ошибку 404.

Поэтому я боюсь, что вам нужно проверить, есть ли у больших двоичных объектов моментальные снимки или нет, прежде чем удалять их пакетным способом.

Комментарии:

1. Вы так правы. Не думал, что это решит проблему. Просто протестируйте и подтвердите — если снимки недоступны, DeleteBlobsAsync() следует вызывать без функции DeleteSnapshotsOption. Включает в себя выстрелы

2. Интересно! Поэтому я попробовал то же самое и смог удалять большие двоичные объекты в пакетном режиме, независимо от того, есть у них снимки или нет. Однако мой код использовал Node SDK. Я попробую то же самое с .Net SDK.