2012-04-03 9 views
13

Próbuję uzyskać informacje na temat blobu Azure (data ostatniej modyfikacji UTC). Informacje te są przechowywane właściwość CloudBlob.Properties.LastModifiedUtc.Składowanie CloudBlob.Properties Azure Storage nie jest inicjowane podczas korzystania z GetBlobReference()

Jeśli użyję metody GetBlobReference() lub GetBlockBlobReference(), właściwości obiektu blob nie zostaną zainicjowane (LastModifiedUtc to DateTime.MinDate). Jeśli używam ListBlobs() Właściwości są poprawnie zainicjowane (LastModifiedUtc ma poprawną wartość).

Czy robię coś nie tak podczas korzystania z funkcji GetBlobReference? Czy istnieje sposób, aby uzyskać instancję CloudBlob tylko dla jednego określonego obiektu typu blob? Wiem, że mogę pominąć ListBlobs() i odfiltrować tylko blob, który mnie interesuje, lub użyć ListBlobsWithPrefix() z klasy CloudBlobClient, ale spodziewam się uzyskać wszystkie metadane, gdy poproszę o konkretny Blob Reference.

kod pokazujący jak pracuję z Azure BLOB:

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

Odpowiedz

34

wierzę, trzeba wykonać połączenie oddzielna aby pobrać atrybuty/metadane. Po odesłaniu do obszaru blob wypisz następującą linię, aby pobrać atrybuty.

cloudBlob_GetBlobReference.FetchAttributes();

+6

Aby opracować, GetBlobReference() nie wykonuje żadnych połączeń sieciowych. To właśnie zwraca obiekt zainicjowany odpowiednim adresem URL. Aby uzyskać atrybuty, musisz wykonać połączenie sieciowe, a .FetchAttributes() jest sposobem, aby to zrobić w minimalnym stopniu (robi żądanie HEAD). – smarx

+0

Och, dziękuję, nie wiedziałem, że GetBlobReference() jest po prostu metodą fabryczną po stronie klienta, spodziewałem się, że zadzwoni przeciwko Azure i byłem zaskoczony, że nie przynosi wszystkich danych. Teraz ma dla mnie sens. – Tiny

+0

bezcenna odpowiedź zaoszczędziła mi wiele –

Powiązane problemy