ListBlobsSegmentedAsyn c внезапно прекращает возвращать файлы в каталоге Blob, даже если проводник хранилища показывает, что файлы там - PullRequest
0 голосов
/ 10 января 2020

Я пробовал разные способы поиска файлов в папке, даже если Azure Обозреватель хранилища ясно показывает, что файлы присутствуют, и точно такой же код и конфигурация работали раньше, ListBlogsSementedAsyn c возвращает 0 файлов.

Используемый код:

    var test = await directoryInfo.ListBlobsSegmentedAsync(new BlobContinuationToken());

    var fileList = await directoryInfo.ListBlobsSegmentedAsync(true, BlobListingDetails.None, take, null, null, null, new CancellationToken());

Я использую учетные записи хранения, настроенные как Datalake v2.

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

Я также пытался использовать разные BlobListingDetails, там ничего не получалось.

Процесс, который выполняется, состоит в том, что у меня есть отдельное задание, которое загружает файлы для обработки в папки, и это задание перечисляет первые X файлов в папке и загружает их для дальнейшей обработки. Это работает некоторое время, но через некоторое время, менее чем через день, ListBlobsSegmentedAsyn c возвращает 0 файлов. Когда я использую Azure Storage Explorer и проверяю папку, в ней находятся тысячи файлов, и на основе обработанных данных это правильный ответ.

РЕДАКТИРОВАНИЕ:

Реализовано с токеном продолжения:

        var directoryInfo = _blobContainer.GetDirectoryReference(directory);

        BlobContinuationToken blobContinuationToken = null;
        var list = new List<IListBlobItem>();
        do
        {
            var resultSegment = await directoryInfo.ListBlobsSegmentedAsync(blobContinuationToken);

            // Get the value of the continuation token returned by the listing call.
            blobContinuationToken = resultSegment.ContinuationToken;
            list.AddRange(resultSegment.Results);
        }
        while (blobContinuationToken != null && list.Count < take); // Loop while the continuation token is not null.

        var filePaths = list.Select(x => (x as IListBlobItem)?.Uri.ToString());
        return filePaths.Where(x => !string.IsNullOrEmpty(x)).ToList();

1 Ответ

2 голосов
/ 16 января 2020

Я не думаю, что вы должны делать новый BlobContinuationToken (). Это может «запутать» SDK. Вы должны передать null изначально . Кроме того, вы действительно повторяете результаты? Т.е. оценивать итоговый ContinuationToken? Первая страница всегда может быть пустой, вы должны проверить токен, чтобы обнаружить, есть ли еще возможные результаты.

Почему ListBlobsSegmentedAsyn c только возвращает результаты на второй странице?

Не удивительно, что вы можете иногда получать пустые страницы или страницы с результатами, меньшими максимального, вместе с токеном продолжения.

https://github.com/Azure-Samples/azure-sdk-for-net-storage-blob-upload-download/blob/master/v11/Program.cs

BlobContinuationToken blobContinuationToken = null;

do
{
    var resultSegment = await cloudBlobContainer.ListBlobsSegmentedAsync(null, blobContinuationToken);

    // Get the value of the continuation token returned by the listing call.
    blobContinuationToken = resultSegment.ContinuationToken;
    foreach (IListBlobItem item in resultSegment.Results)
    {
        Console.WriteLine(item.Uri);
    }
} 
while (blobContinuationToken != null); // Loop while the continuation token is not null.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...