CloudBlockBlob:DownloadTextAsync和UploadTextAsync以及元数据/属性

xar*_*tal 1 c# azure azure-storage azure-storage-blobs

与文档azure docmsdn一样,您必须调用FetchAttributesAsync()以填充CloudBlockBlob的元数据.

我注意到,当我打电话时,元数据也会被填充,DownloadTextAsync()并且在我打电话时写入UploadTextAsync().这是否安全使用,因为它在将来版本的存储sdk中不会改变?我无法找到任何确认该行为的文档.

样品:

        var blob = container.GetBlockBlobReference("testblob");

        blob.Metadata["testdata"] = "set";

        await blob.UploadTextAsync("content");

        blob.Metadata["notset"] = "set";

        blob = container.GetBlockBlobReference("testblob");

        var content = await blob.DownloadTextAsync();
        // here content["testdata"] is set and content["notset"] is null
Run Code Online (Sandbox Code Playgroud)

谢谢你告诉我这件事!

Gau*_*tri 6

让我试着解释你的代码发生了什么.看看这是否澄清了您的疑虑.

执行以下代码时:

await blob.UploadTextAsync("content");
Run Code Online (Sandbox Code Playgroud)

本质上它调用Put BlobREST API.从REST API文档中可以看出,使用blob.Metadata["testdata"] = "set";代码指定的任何元数据元素都会传递到x-ms-meta-testdata标头中的REST API .

因此,当执行此代码时,元数据将与blob一起保存.

执行以下代码行时:

blob.Metadata["notset"] = "set";
Run Code Online (Sandbox Code Playgroud)

基本上,blob对象(属于类型CloudBlockBlob)Metadata属性会更新.此更新仅在客户端发生,并且没有任何内容保存在blob中.为了保存它,你必须打电话SetMetadataAsync.

来到最后一部分,当您执行以下代码行时:

var content = await blob.DownloadTextAsync();
Run Code Online (Sandbox Code Playgroud)

本质上它调用Get BlobREST API.从REST API文档中可以看出,此操作还会在响应头中返回blob的元数据.然后,Azure存储客户端库使用收到的数据更新Metadata您的属性,blob以响应REST API调用.