11

几个小时以来,我一直在尝试在使用 Azure SDK 创建的 blob 上设置一些元数据。我使用异步上传数据BeginUploadFromStream(),一切顺利。上传完成后,我可以使用它的 URI 访问 blob,因此它已成功创建,但是我设置的任何元数据都不会持久化

我在调用EndUploadFromStream()设置了元数据。

我尝试通过文档可以找到的三种方式设置元数据:

// First attempt
myBlob.Metadata["foo"] = "bar";

// Second attempt
myBlob.Metadata.Add("foo", "bar");

//Third attempt
var metadata = new NameValueCollection();
metadata["foo"] = "bar";
blob.Metadata.Add(metadata);

设置元数据后,我调用myBlob.SetMetadata()以将元数据保存到 Azure,如文档所指定,但它不会粘住。该调用不会引发任何异常,但是当我获得对我的 blob 的新引用时,它没有任何元数据

我也尝试过使用异步保存元数据BeginSetMetadata()EndSetMetadata()但结果相似。

我开始认为我在这里遗漏了一些非常微不足道的东西,但是盯着它看了五个小时后,我仍然不明白我哪里错了?

4

2 回答 2

22

SetMetadata 应该按预期工作。但是仅仅获得对 blob 的引用并不足以读取元数据。

获取 blob 引用后,您需要调用该CloudBlob上的 FetchAttributes 方法。这将加载所有属性和元数据,然后您才能访问您之前设置的元数据:

// Get a reference to a blob.
CloudBlob blob = blobClient.GetBlobReference("mycontainer/myblob.txt");

// Populate the blob's attributes.
blob.FetchAttributes();

// Enumerate the blob's metadata.
foreach (var metadataKey in blob.Metadata.Keys)
{
    Console.WriteLine("Metadata name: " + metadataKey.ToString());
    Console.WriteLine("Metadata value: " + blob.Metadata.Get(metadataKey.ToString()));
}
于 2012-10-23T13:23:06.877 回答
1

我看到这个问题已经很老了,与此同时,我想,API 已经改变了。

现在,如果要获取元数据,则需要在以下代码段中使用BlobTraits.Metadata选项:

await foreach (BlobItem item in containerClient.GetBlobsAsync(BlobTraits.Metadata))
{
    var name = item.Name;
    var meta = item.Metadata;
}
于 2020-10-14T11:49:23.680 回答