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));
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
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
bezcenna odpowiedź zaoszczędziła mi wiele –