几个小时以来,我一直在尝试使用Azure SDK在我创建的blob上设置一些元数据。我使用BeginUploadFromStream()
异步上传数据,一切顺利。我可以在上传完成后使用其URI访问blob,因此创建成功,但我设置的任何元数据都不会保留。
我在调用EndUploadFromStream()
之后设置元数据。
我尝试通过documentation找到三种方式设置元数据:
// 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()
异步保存元数据,但结果相似。
我开始认为我在这里遗漏了一些非常微不足道的东西,但是在盯着它看了五个小时之后,我仍然无法理解我哪里出错了?
答案 0 :(得分:21)
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()));
}
答案 1 :(得分:0)
我看到这个问题已经很老了,与此同时,我想API也已经改变了。
现在,如果要获取元数据,则需要在以下代码段中使用 BlobTraits.Metadata 选项:
await foreach (BlobItem item in containerClient.GetBlobsAsync(BlobTraits.Metadata))
{
var name = item.Name;
var meta = item.Metadata;
}