【问题标题】:Blob metadata is not saved even though I call CloudBlob.SetMetadata即使我调用 CloudBlob.SetMetadata 也不会保存 Blob 元数据
【发布时间】:2012-10-23 13:08:14
【问题描述】:

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

我开始觉得我在这里遗漏了一些非常琐碎的东西,但是盯着它看了五个小时后,我还是不明白我哪里错了?

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 正如我当时所怀疑的那样,一件非常微不足道的事情!我想我太专注于写作是问题的想法——甚至没有考虑到问题可能是读取属性。非常感谢,您为我节省了很多时间!
    【解决方案2】:

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

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

    await foreach (BlobItem item in containerClient.GetBlobsAsync(BlobTraits.Metadata))
    {
        var name = item.Name;
        var meta = item.Metadata;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-06
      • 2012-03-01
      • 2021-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多