Сначала я получаю все свои капли следующим образом:
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 действительно считает, что это запрещено, хотя у меня уже есть тысячи и тысячи больших двоичных объектов с пустыми именами каталогов виртуальных путей.
@GauravMantri Не совсем, но рассматриваемые объекты называются //[somestring].
Извините, я хотел спросить, начинается ли имя вашего BLOB-объекта с //
(одна косая черта для каждой пустой папки)? Можете ли вы попробовать URL-кодирование имени большого двоичного объекта? Что-то вроде var blobClient = blobContainer.GetBlobClient(HttpUtility.UrlEncode(blobItem.Name));
?
@GauravMantri Ответ на ваш первый вопрос — да. Попробовал закодировать, как вы предложили, но без разницы.
Здесь происходит то, что 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.
Спасибо, это работает. Для ясности я отредактировал свой вопрос и удалил свои комментарии относительно косых черт, закодированных по умолчанию, поскольку я не могу это воспроизвести и, должно быть, забыл, что я использовал ваш тест на кодирование вручную.
Имя вашего шарика
//somename
?