使用DownloadToStreamAsync,指定的blob不存在

时间:2017-02-04 18:06:37

标签: uwp azure-storage azure-storage-blobs azure-stream-analytics

我有一段代码(在UWP应用程序中)从Azure存储中读取blob。我可以连接,枚举容器并找到blob,但是当我尝试下载它时,我得到异常:指定的blob不存在。

使用Azure门户,我可以浏览容器,我看到blob,甚至可以交互式下载。我已检查过网址,但他们匹配。 我在同一个容器中的其他文件夹中有其他blob,代码下载它们很好。

blob是通过Stream Analytics作业自动创建的,这与创建其他blob的方式相同。

    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());
    }

编辑:堆栈跟踪:

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 个答案:

答案 0 :(得分:1)

找到它。

事实证明,通过传递 BlobListingDetails.All ,我包含了未提交的 blob,在我的案例中包含了我之前删除的blob。在我的帖子中我提到匹配的URL,显然我忽略了增加的“_2.csv”,大概是由流作业。

查看实际的服务器请求,这会添加以下查询字符串:

    &include=snapshots,uncommittedblobs,metadata,copy

我假设我的FirstOrDefault()正在拾取该容器中的第一个也是唯一的结果(带有该前缀),但是有2个blob,第一个是原始删除(未提交)的blob。

通过传递 BlobListingDetails.None ,这将删除&amp; include 查询字符串,并仅返回已提交的blob。

    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中的问题。