2012-04-03 20 views
13

Tôi đang cố gắng lấy một số thông tin về Azure blob (thời gian ngày UTC được sửa đổi lần cuối). Thông tin này được lưu trữ thuộc tính CloudBlob.Properties.LastModifiedUtc.Lưu trữ Azure CloudBlob.Properties không được khởi tạo khi sử dụng GetBlobReference()

Nếu tôi sử dụng phương thức GetBlobReference() hoặc GetBlockBlobReference(), Thuộc tính của blob không được khởi tạo (LastModifiedUtc là DateTime.MinDate). Nếu tôi sử dụng ListBlobs() các thuộc tính được khởi tạo đúng (LastModifiedUtc có giá trị chính xác).

Tôi có làm gì sai khi sử dụng chức năng GetBlobReference không? Có cách nào để có được cá thể CloudBlob chỉ cho một đốm màu cụ thể không? Tôi biết tôi có thể bỏ qua ListBlobs() và chỉ lọc blob mà tôi quan tâm, hoặc sử dụng ListBlobsWithPrefix() từ lớp CloudBlobClient, nhưng tôi hy vọng sẽ nhận được tất cả siêu dữ liệu khi tôi yêu cầu tham chiếu Blob cụ thể.

Mã cho thấy làm thế nào tôi đang làm việc với các đốm màu Azure:

string storageAccountName = "test"; 
    string storageAccountKey = @"testkey"; 
    string blobUrl = "https://test.blob.core.windows.net"; 
    string containerName = "testcontainer"; 
    string blobName = "testbontainer"; 

    var credentials = new StorageCredentialsAccountAndKey(storageAccountName, storageAccountKey); 
    var cloudBlobClient = new CloudBlobClient(blobUrl, credentials); 
    var containerReference = cloudBlobClient.GetContainerReference(string.Format("{0}/{1}", blobUrl, containerName)); 

    // OK - Result is of type CloudBlockBlob, cloudBlob_ListBlobs.Properties.LastModifiedUtc > DateTime.MinValue 
    var cloudBlob_ListBlobs = containerReference.ListBlobs().Where(i => i is CloudBlob && ((CloudBlob)i).Name == blobName).FirstOrDefault() as CloudBlob; 

    // WRONG - Result is of type CloudBlob, cloudBlob_GetBlobReference.Properties.LastModifiedUtc == DateTime.MinValue 
    var cloudBlob_GetBlobReference = containerReference.GetBlobReference(string.Format("{0}/{1}/{2}", blobUrl, containerName, blobName)); 

    // WRONG - Result is of type CloudBlockBlob, cloudBlob_GetBlockBlobReference.Properties.LastModifiedUtc == DateTime.MinValue 
    var cloudBlob_GetBlockBlobReference = containerReference.GetBlockBlobReference(string.Format("{0}/{1}/{2}", blobUrl, containerName, blobName)); 

Trả lời

34

Tôi tin rằng bạn phải thực hiện một cuộc gọi riêng biệt để lấy các thuộc tính/siêu dữ liệu. Sau khi bạn có tham chiếu blob, hãy đưa ra dòng sau để truy xuất các thuộc tính.

cloudBlob_GetBlobReference.FetchAttributes();

+6

Để xây dựng, GetBlobReference() không thực hiện bất kỳ cuộc gọi mạng nào. Nó khá nhiều chỉ trả về cho bạn một đối tượng được khởi tạo với URL phù hợp. Để có được các thuộc tính, bạn cần thực hiện cuộc gọi mạng và .FetchAttributes() là cách tối thiểu thực hiện điều đó (thực hiện yêu cầu HEAD). – smarx

+0

Oh, cảm ơn, tôi đã không nhận thức được rằng GetBlobReference() chỉ là phương pháp nhà máy phía khách hàng, tôi mong đợi nó để thực hiện cuộc gọi chống lại Azure và tôi đã ngạc nhiên nó không mang lại tất cả các dữ liệu. Bây giờ nó có ý nghĩa với tôi. – Tiny

+0

câu trả lời vô giá đã cứu tôi rất nhiều –

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