2013-12-12 13 views
7

Sto provando a passare un BLOB di archiviazione Azure attraverso un ashx. Sul blockBlob.DownloadToStream (MemoryStream) è gettare la seguente eccezione: Microsoft.WindowsAzure.Storage.StorageException: Calculated MD5 does not match existing propertyArchiviazione di Azure L'MD5 calcolato non corrisponde alla proprietà esistente

Lo so che è trovare il blob corretta. Se metto un container e un percorso che non esistono, mi dà invece un'eccezione 404.

Ho cercato su google per suggerimenti su ciò che potrebbe causare questo errore ma non è utile nulla di utile. Qualcuno ha qualche idea su cosa potrebbe causare questo? Ho riscritto questo codice in un paio di modi diversi negli ultimi due giorni ma muore sempre su DownloadToStream.

using Microsoft.WindowsAzure; 
using Microsoft.WindowsAzure.Storage; 
using Microsoft.WindowsAzure.Storage.Auth; 
using Microsoft.WindowsAzure.Storage.Blob; 

public void ProcessRequest(HttpContext context) { 
    // Retrieve storage account from connection string. 
    Microsoft.WindowsAzure.Storage.CloudStorageAccount storageAccount = Microsoft.WindowsAzure.Storage.CloudStorageAccount.Parse(Microsoft.WindowsAzure.CloudConfigurationManager.GetSetting("StorageConnectionString")); 

    // Create the blob client. 
    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); 

    // Retrieve reference to a previously created container. 
    CloudBlobContainer container = blobClient.GetContainerReference("gmt"); 

    // Retrieve reference to blob named "articles/142/222.jpg". 
    CloudBlockBlob blockBlob = container.GetBlockBlobReference("articles/142/222.jpg"); 

    using (var memoryStream = new MemoryStream()) { 
     blockBlob.DownloadToStream(memoryStream); 
     byte[] photoByte = ReadFully(memoryStream); 
     context.Response.Clear(); 
     context.Response.ContentType = "image/jpeg"; 
     context.Response.OutputStream.Write(photoByte, 0, photoByte.Length); 
    } 
} 

public static byte[] ReadFully(Stream input) { 
    input.Position = 0; 
    using (MemoryStream ms = new MemoryStream()) { 
     input.CopyTo(ms); 
     return ms.ToArray(); 
    } 
} 

risposta

6

Sono stato in grado di ricreare il problema che stai affrontando. Ciò accade se la proprietà Content MD5 del BLOB è in qualche modo danneggiata. Ho avuto un blob con alcuni contenuti MD5 (che era corretto). Ho quindi modificato a livello di codice l'MD5 su un altro valore (che non è corretto). Ora quando chiamo il metodo DownloadToStream() sul blob, ottengo lo stesso errore.

è possibile ignorare questo controllo impostando DisableContentMD5Validation a true in BlobRequestOptions come mostrato nel seguente codice:

  BlobRequestOptions options = new BlobRequestOptions() 
      { 
       DisableContentMD5Validation = true, 
      }; 
      blockBlob.DownloadToStream(memoryStream, null, options); 

fare un tentativo e dovrebbe funzionare.

Nota a margine, è possibile modificare anche il metodo ReadFully. Dovresti spostare il puntatore del flusso input all'inizio.

public static byte[] ReadFully(Stream input) 
    { 
     input.Position = 0;//Positioning it to the top of stream. 
     using (MemoryStream ms = new MemoryStream()) 
     { 
      input.CopyTo(ms); 
      return ms.ToArray(); 
     } 
    } 
+0

Grazie. Ci proverò stasera. Ho caricato 13 concerti di immagini usando l'FTP per Azure Blob Storage Bridge. Ogni file che ho provato mi dà questo messaggio di errore. Mi chiedo se questo è ciò che ha danneggiato tutti i file. –

+0

che ha reso l'eccezione andare via grazie. l'ashx sta ancora restituendo solo 0 byte. booooooo ... –

+1

Basta controllare la posizione di 'ms' nella funzione' ReadFully() 'del tuo. Assicurati che sia anche a 0. –

Problemi correlati