指定的 blob 不存在,使用 DownloadToStreamAsync
The specified blob does not exist, using DownloadToStreamAsync
我有一段代码(在 UWP 应用中)从 Azure 存储中读取一个 blob。我可以连接、枚举容器并找到 blob,但是当我尝试下载它时出现异常:指定的 blob 不存在。
使用 Azure 门户,我可以浏览容器,查看 blob,甚至可以交互式下载。我已经检查了 URL,它们是匹配的。
我在同一个容器的其他文件夹中有其他 blob,代码可以很好地下载它们。
blob 是通过流分析作业自动创建的,这与创建其他 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()
我试图获取 fiddler 跟踪,但在将其与 UWP 应用程序一起使用时遇到了问题。
关于如何解决此错误的任何建议?
谢谢
-约翰
找到了。
事实证明,通过传递 BlobListingDetails.All,我包含了 uncommitted blob,在我的例子中包含了一个 blob I之前已经删除了。在我的 post 中,我提到了匹配的 URL,显然我忽略了增加的“_2.csv”,大概是通过流作业。
查看实际的服务器请求,这会添加以下查询字符串:
&include=snapshots,uncommittedblobs,metadata,copy
我假设我的 FirstOrDefault() 正在获取该容器中的第一个且唯一的结果(具有该前缀),但是有 2 个 blob,第一个是原始删除(未提交)的 blob。
通过传递 BlobListingDetails.None,这将删除 &include 查询字符串,并且仅删除 returns 提交的 blob。
var blobs = await container.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.None, null, null, options, context);
var item = blobs.Results.OfType<CloudBlockBlob>().FirstOrDefault();
-约翰
P.S。我从未在我的 UWP 中使用 Fiddler 运行,我不得不转到控制台应用程序以在 Fiddler 中对此进行故障排除。
我有一段代码(在 UWP 应用中)从 Azure 存储中读取一个 blob。我可以连接、枚举容器并找到 blob,但是当我尝试下载它时出现异常:指定的 blob 不存在。
使用 Azure 门户,我可以浏览容器,查看 blob,甚至可以交互式下载。我已经检查了 URL,它们是匹配的。 我在同一个容器的其他文件夹中有其他 blob,代码可以很好地下载它们。
blob 是通过流分析作业自动创建的,这与创建其他 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()
我试图获取 fiddler 跟踪,但在将其与 UWP 应用程序一起使用时遇到了问题。 关于如何解决此错误的任何建议?
谢谢
-约翰
找到了。
事实证明,通过传递 BlobListingDetails.All,我包含了 uncommitted blob,在我的例子中包含了一个 blob I之前已经删除了。在我的 post 中,我提到了匹配的 URL,显然我忽略了增加的“_2.csv”,大概是通过流作业。
查看实际的服务器请求,这会添加以下查询字符串:
&include=snapshots,uncommittedblobs,metadata,copy
我假设我的 FirstOrDefault() 正在获取该容器中的第一个且唯一的结果(具有该前缀),但是有 2 个 blob,第一个是原始删除(未提交)的 blob。
通过传递 BlobListingDetails.None,这将删除 &include 查询字符串,并且仅删除 returns 提交的 blob。
var blobs = await container.ListBlobsSegmentedAsync(prefix, true, BlobListingDetails.None, null, null, options, context);
var item = blobs.Results.OfType<CloudBlockBlob>().FirstOrDefault();
-约翰
P.S。我从未在我的 UWP 中使用 Fiddler 运行,我不得不转到控制台应用程序以在 Fiddler 中对此进行故障排除。