即使我调用CloudBlob.SetMetadata,也不会保存Blob元数据

时间:2012-10-23 13:08:14

标签: c# asp.net azure azure-storage-blobs azure-sdk-.net

几个小时以来,我一直在尝试使用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()异步保存元数据,但结果相似。

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

2 个答案:

答案 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;
}