2012-10-23 26 views
8

Trong một vài giờ, tôi đã cố gắng đặt một số siêu dữ liệu trên blob mà tôi tạo bằng Azure SDK. Tôi tải lên dữ liệu một cách không đồng bộ bằng cách sử dụng BeginUploadFromStream() và mọi thứ hoạt động suôn sẻ. Tôi có thể truy cập blob bằng URI của nó khi quá trình tải lên hoàn tất, vì vậy nó được tạo thành công, tuy nhiên, bất kỳ siêu dữ liệu nào tôi đặt không được giữ nguyên .Siêu dữ liệu Blob không được lưu mặc dù tôi gọi CloudBlob.SetMetadata

Tôi đặt siêu dữ liệu sau gọi EndUploadFromStream().

Tôi đã cố gắng thiết lập siêu dữ liệu trong ba cách tôi có thể tìm thấy thông qua các 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); 

Sau khi thiết lập siêu dữ liệu tôi gọi myBlob.SetMetadata() để lưu các siêu dữ liệu để Azure, theo quy định của các tài liệu, nhưng nó không dính. Cuộc gọi không trow bất kỳ trường hợp ngoại lệ, nhưng khi tôi nhận được một tham chiếu mới để blob của tôi, nó không có bất kỳ siêu dữ liệu.

Tôi đã thử lưu siêu dữ liệu một cách không đồng bộ cũng như sử dụng BeginSetMetadata()EndSetMetadata() nhưng có kết quả tương tự.

Tôi bắt đầu nghĩ rằng tôi đang thiếu thứ gì đó thực sự tầm thường ở đây, nhưng sau khi nhìn chằm chằm vào nó trong năm giờ, tôi vẫn không thể hiểu được nơi tôi đi sai?

Trả lời

20

SetMetadata sẽ hoạt động như mong đợi. Nhưng chỉ đơn giản là nhận được một tham chiếu đến blob là không đủ để đọc siêu dữ liệu.

Sau khi tham chiếu blob, bạn cần gọi phương thức FetchAttributes trên CloudBlob đó. Thao tác này sẽ tải tất cả các thuộc tính và siêu dữ liệu và chỉ khi đó bạn mới có thể truy cập siêu dữ liệu mà bạn đã đặt trước đây:

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

Như tôi đã nghi ngờ, điều thực sự tầm thường! Tôi đoán tôi đã quá tập trung vào ý tưởng rằng viết là vấn đề - thậm chí không xem xét rằng vấn đề có thể được đọc các thuộc tính. Cảm ơn rất nhiều, bạn đã tiết kiệm được rất nhiều thời gian! –

Các vấn đề liên quan