0

У меня есть часть кода (в приложении UWP), которая читает blob из хранилища Azure. Я могу подключиться, перечислить контейнер и найти blob, однако, когда я пытаюсь загрузить его, я получаю исключение: Указанный blob не существует.Указанный blob не существует, используя DownloadToStreamAsync

Используя портал Azure, я могу просматривать контейнер, я вижу blob и даже могу скачать интерактивно. Я проверил URL-адреса, и они совпадают. У меня есть другие капли в других папках в одном контейнере, код загружает их в порядке.

Блаб создается автоматически с помощью задания Stream Analytics, так же, как и другие капли.

string csvText = null; 

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CONNECTION_STRING); 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 
    CloudBlobContainer container = blobClient.GetContainerReference(CONTAINER_NAME); 

    OperationContext context = new OperationContext(); 
    BlobRequestOptions options = new BlobRequestOptions(); 

    string prefix = string.Format("{0}/{1:yyyy/MM/dd/HH}", ROOT_FOLDER, SAMPLE_DATE); // ex: telemetry/2016/12/31/22 
    var blobs = await container.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.All, null, null, options, context); 

    CloudBlockBlob item = blobs.Results.FirstOrDefault() as CloudBlockBlob; //  <<<< I see the blob here. 
    using (var memoryStream = new MemoryStream()) 
    { 
     await item.DownloadToStreamAsync(memoryStream); //  <<<< The specified blob does not exist. 
     csvText = System.Text.Encoding.UTF8.GetString(memoryStream.ToArray()); 
    } 

EDIT: Трассировка стека:

Source Microsoft.WindowsAzure.Storage 
at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.<ExecuteAsyncInternal>d__c`1.MoveNext() 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.<>c__DisplayClass11.<<DownloadRangeToStreamAsync>b__10>d__13.MoveNext() 
at System.Runtime.CompilerServices.TaskAwaiter.ThrowForNonSuccess(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) 
at System.Runtime.CompilerServices.TaskAwaiter.GetResult() 
at HomeControl.Views.Historical.<LoadData>d__7.MoveNext() 

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

Благодаря

-John

ответ

1

Нашел.

Оказывается, что при прохождении BlobListingDetails.All, я в том число неподтвержденных сгустков, которые в моем случае включавших блобы я удален ранее. В моем сообщении я упомянул о совпадении URL-адресов, по-видимому, я упустил «_2.csv», который был увеличен, предположительно, по заданию потока.

Глядя на запрос фактического сервера, это добавляет следующую строку запроса:

&include=snapshots,uncommittedblobs,metadata,copy 

Я предположил мой FirstOrDefault() был подбирая первый и единственный в результате этого контейнера (с префиксом), но были 2 капли, а первый был исходным удаленным (незафиксированным) блобом.

Пропустив BlobListingDetails.None, это снимает & включают строку запроса и возвращает только совершенные сгустки.

var blobs = await container.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.None, null, null, options, context); 
    var item = blobs.Results.OfType<CloudBlockBlob>().FirstOrDefault(); 

-John

P.S. У меня никогда не было Fiddler для запуска в моем UWP, мне пришлось перейти к консольному приложению, чтобы устранить это в Fiddler.

 Смежные вопросы

  • Нет связанных вопросов^_^