2013-12-12 13 views
7

Próbuję przekazać blob Azure Storage przez ashx. Na blockBlob.DownloadToStream (MemoryStream) to rzuca następujący wyjątek: Microsoft.WindowsAzure.Storage.StorageException: Calculated MD5 does not match existing propertyObliczenia MDU w magazynie Azure nie pasują do istniejącej właściwości

wiem, że znalezienie odpowiedniej blob. Jeśli wstawię kontener i ścieżkę, które nie istnieją, to zamiast tego otrzymam 404 wyjątek.

Użyłem Google'a, aby uzyskać wskazówki, co może być przyczyną tego błędu, ale nie ma już nic przydatnego. Czy ktoś ma jakiekolwiek przemyślenia na temat tego, co może być przyczyną tego? W ciągu ostatnich kilku dni przepisałem ten kod na kilka różnych sposobów, ale zawsze umiera na 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(); 
    } 
} 

Odpowiedz

6

Udało mi się odtworzyć problem, przed którym stoisz. Dzieje się tak, jeśli właściwość obiektu blob Content MD5 jest w jakiś sposób uszkodzona. Miałem blob z pewną zawartością MD5 (co było poprawne). Następnie programowo zmieniłem MD5 na inną wartość (która jest niepoprawna). Teraz, gdy wywołuję metodę DownloadToStream() na obiekcie blob, otrzymuję dokładnie ten sam błąd.

Można ominąć tę kontrolę poprzez ustawienie DisableContentMD5Validation do true w BlobRequestOptions jak pokazano w poniższym kodzie:

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

Spróbować i powinno działać.

Na marginesie, możesz również zmodyfikować swoją metodę ReadFully. Będziesz musiał przenieść wskaźnik strumienia input na początek.

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

Dzięki. Spróbuję tego dziś wieczorem. Przesłałem 13 gigabajtów obrazów za pomocą FTP do Azure Blob Storage Bridge. Każdy wypróbowany plik daje mi ten komunikat o błędzie. Zastanawiam się, czy to właśnie powoduje uszkodzenie wszystkich plików. –

+0

, dzięki czemu wyjątek zniknął dzięki. ashx wciąż zwraca tylko 0 bajtów. booooooo ... –

+1

Po prostu sprawdź pozycję 'ms' w funkcji' ReadFully() 'twojej. Upewnij się, że jest to również 0. –

Powiązane problemy