Невозможно прочитать большие двоичные объекты через BlobContainerClient для больших двоичных объектов с пустыми префиксами папок

Сначала я получаю все свои капли следующим образом:

var resultSegment = await blobContainer.GetBlobsAsync().AsPages(continuationToken, batchSize).FirstOrDefaultAsync();

Я повторяю их следующим образом:

foreach (var blobItem in resultSegment.Values)

Когда я пытаюсь прочитать объект с именем //somename (например, [пустая папка]/[пустая папка]/какое-то имя):

var blobClient = blobContainer.GetBlobClient(blobItem.Name);
var exists = await blobClient.ExistsAsync();
var tags = await blobClient.GetTagsAsync();

Я получаю существует == false и RequestFailedException в GetTagsAsync.

Это отлично работает для больших двоичных объектов, у которых нет пустых префиксов папок.

Я думаю, что это очень странно, поскольку blobContainer.GetBlobClient принимает только один аргумент — имя большого двоичного объекта, а имя большого двоичного объекта я получаю непосредственно из BlobItem, полученного из GetBlobsAsync.

Все мои пакеты nuget обновлены до последних версий.

Обновлять

Я собирался использовать Azure Storage Explorer для создания некоторых тестовых данных для дальнейшего изучения этого вопроса, и интересно, что с помощью этого инструмента я не могу создать виртуальную папку без имени «Имя не должно быть пустым». и я не могу указать последовательные косые черты в каталоге назначения для файла: «Путь к каталогу не должен содержать последовательные косые черты».

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

Имя вашего шарика //somename?

Gaurav Mantri 22.07.2024 15:05

@GauravMantri Не совсем, но рассматриваемые объекты называются //[somestring].

Alex 22.07.2024 15:15

Извините, я хотел спросить, начинается ли имя вашего BLOB-объекта с // (одна косая черта для каждой пустой папки)? Можете ли вы попробовать URL-кодирование имени большого двоичного объекта? Что-то вроде var blobClient = blobContainer.GetBlobClient(HttpUtility.UrlEncode(blobItem.N‌​ame));?

Gaurav Mantri 22.07.2024 15:28

@GauravMantri Ответ на ваш первый вопрос — да. Попробовал закодировать, как вы предложили, но без разницы.

Alex 22.07.2024 15:36
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
4
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Здесь происходит то, что SDK автоматически удаляет начальные символы / из имени BLOB-объекта, когда вы сейчас создаете клиент BLOB-объекта, и из-за этого ваши запросы не выполняются.

Чтобы устранить эту проблему, создайте экземпляр BlobClient, используя URI BLOB-объекта. Например, если вы используете имя и ключ учетной записи, вы можете это сделать следующим образом:

foreach (var blobItem in resultSegment.Values)
{
    var blobUri = new Uri($"{blobContainer.Uri}/{blobItem.Name}");//assuming blobContainer is an instance of BlobContainerClient
    var blobClient = new BlobClient(blobUri, new StorageSharedKeyCredential("account-name", "account-key"));
    var exists = await blobClient.ExistsAsync();//should come as true
    var tags = await blobClient.GetTagsAsync();//should not fail
}

Переопределения всех конструкторов см. по этой ссылке: https://learn.microsoft.com/en-us/dotnet/api/azure.storage.blobs.blobclient?view=azure-dotnet#constructors.

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

Alex 24.07.2024 10:21

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

Извлечение данных из хранилища BLOB-объектов в Databricks[автоматизация]
Рекомендуемая практика доступа к хранилищу BLOB-объектов
Как скачать файл в учетную запись хранения Azure из приложения-функции
Дополнительные файлы (блочные BLOB-объекты), создаваемые при копировании хранилища BLOB-объектов в ADF
Как скопировать все контейнеры без явного упоминания в массиве между двумя разными учетными записями хранения
Репликация базы данных SQL Azure и хранилища BLOB-объектов в конфигурации с несколькими регионами
Функция, запускаемая Blob-объектом, работает локально, но не развертывается (не вызывается)
Серверу не удается аутентифицировать запрос при использовании Azurite для копирования больших двоичных объектов из одного контейнера в другой
Как я могу подтвердить доступ к хранилищу BLOB-объектов в Python с помощью токена OAuth2?
Возможность загрузки документов с помощью Azure Document Intelligence из хранилища контейнеров Azure