Estoy tratando de obtener información acerca del blob de Azure (última fecha de UTC modificada). Esta información se almacena en la propiedad CloudBlob.Properties.LastModifiedUtc.Azure Storage CloudBlob.Properties no se inicializan al usar GetBlobReference()
Si uso el método GetBlobReference() o GetBlockBlobReference(), las Propiedades del blob no se inicializan (LastModifiedUtc es DateTime.MinDate). Si utilizo ListBlobs(), las Propiedades se inicializan correctamente (LastModifiedUtc tiene el valor correcto).
¿Estoy haciendo algo mal cuando uso la función GetBlobReference? ¿Hay alguna forma de obtener la instancia de CloudBlob solo para un blob específico? Sé que puedo omitir ListBlobs() y filtrar solo el blob que me interesa, o usar ListBlobsWithPrefix() de la clase CloudBlobClient, pero esperaría obtener todos los metadatos cuando solicite una Referencia de Blob específica.
Código que muestra cómo estoy trabajando con manchas 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));
Para elaborar, GetBlobReference() no realiza ninguna llamada de red. Simplemente te devuelve un objeto que se inicializó con la URL correcta. Para obtener los atributos, debe realizar una llamada de red, y .FetchAttributes() es la forma mínima de hacerlo (hace una solicitud HEAD). – smarx
Oh, gracias, no sabía que GetBlobReference() es solo un método de fábrica del lado del cliente, esperaba que hiciera una llamada en contra de Azure y me sorprendió que no traiga todos los datos. Ahora tiene sentido para mí. – Tiny
respuesta invaluable me salvó mucho –