2012-04-03 12 views
13

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

Respuesta

34

creo que usted tiene que hacer una llamada separada a buscar el atributos/metadatos. Después de tener la referencia de blob, emita la siguiente línea para recuperar los atributos.

cloudBlob_GetBlobReference.FetchAttributes();

+6

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

+0

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

+0

respuesta invaluable me salvó mucho –

Cuestiones relacionadas