Не удается удалить большой двоичный объект, который запускает привязку входных данных функционального блока Azure - PullRequest
0 голосов
/ 19 октября 2018

Это дополнительный вопрос к этому вопросу:

Как удалить BLOB-объект с помощью функций Azure?

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

Когда я запускаю следующий код:

CloudStorageAccount storageAccount = CloudStorageAccount.Parse(connection);
var blobClient = storageAccount.CreateCloudBlobClient();
var container = blobClient.GetContainerReference("process");
var blockBlob = container.GetBlockBlobReference($"process/in/{name}"); // ==> This was the problem. See the answer for more info. 
bool deleted = blockBlob.DeleteIfExists();

, метод blockBlob.DeleteIfExists() всегда возвращает false и никогда не удаляет BLOB-объект.

Я предполагаю, что BLOB-объект каким-то образом заблокирован выполнением функции, поскольку он только что вызвал ее.

[Обновление 1]

...

[Обновление 2]

Большое спасибо @Jerry Liu, проблема не имела никакого отношения к Azure Fundctions.

Хитрость в том, что blockBlob.DeleteIfExists() возвращает false, когда вызывающий отправляет неверный путь по ошибке.

Лучшим подходом может быть использование blockBlob.Delete и выяснение, в чем именно заключается проблема.

См. Исходный код DeleteIfExists для получения дополнительной информации.

https://github.com/Azure/azure-storage-net/blob/master/Lib/ClassLibraryCommon/Blob/CloudBlob.cs#L1993

Еще один связанный с этим вопрос: Azure CloudBlockBlob.DeleteIfExists () - всегда ли false означает, что BLOB-объект не выполняетне существует?

1 Ответ

0 голосов
/ 21 октября 2018

Проблема находится в этой строке

var blockBlob = container.GetBlockBlobReference($"process/in/{name}");

Имя BLOB-объекта должно быть $"in/{name}", потому что мы вызываем GetBlockBlobReference на основе определенного контейнера, который мы уже получили в GetContainerReference.

Дубликат приводит к тому, что хранилище не может найти блоб.Мы можем быть озадачены отсутствием соответствующего приглашения / исключения, поскольку DeleteIfExists также возвращает false, когда BLOB-объекта не существует.

...