2013-12-12 11 views
7

मैं एशक्स के माध्यम से एक एज़ूर स्टोरेज ब्लॉब पास करने का प्रयास कर रहा हूं। Microsoft.WindowsAzure.Storage.StorageException: Calculated MD5 does not match existing propertyAzure संग्रहण परिकलित MD5 मौजूदा प्रॉपर्टी से मेल नहीं खाता

मैं इसे सही ब्लॉब खोजने है पता: blockBlob.DownloadToStream (MemoryStream) पर यह निम्नलिखित अपवाद फेंक रहा है। अगर मैं एक कंटेनर और पथ डालता हूं जो अस्तित्व में नहीं है तो यह मुझे इसके बजाय 404 अपवाद देता है।

मैंने इस त्रुटि के कारण होने वाले संकेतों के लिए गुगल किया है लेकिन कुछ भी उपयोगी नहीं है। क्या किसी के पास इस पर कोई विचार है कि इसका क्या कारण हो सकता है? मैंने पिछले कुछ दिनों में इस कोड को दो अलग-अलग तरीकों से फिर से लिखा है लेकिन यह हमेशा डाउनलोडटॉस्ट्रीम पर मर जाता है।

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

उत्तर

6

मैं जिस समस्या का सामना कर रहा हूं उसे फिर से बनाने में सक्षम था। ऐसा तब होता है जब Content MD5 ब्लॉब की प्रॉपर्टी किसी भी तरह दूषित हो जाती है। मुझे कुछ सामग्री MD5 (जो सही था) के साथ एक ब्लॉब था। मैंने प्रोग्रामेटिक रूप से एमडी 5 को किसी अन्य मूल्य में बदल दिया (जो गलत है)। अब जब मैं ब्लॉब पर DownloadToStream() विधि को कॉल करता हूं, तो मुझे एक ही त्रुटि मिलती है।

आपको इस चेक DisableContentMD5Validation की स्थापना करके true को BlobRequestOptions में के रूप में नीचे दिए गए कोड में दिखाया गया बायपास कर सकते हैं:

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

इसे आज़मा कर देखें और यह काम करना चाहिए।

एक तरफ नोट पर, आप अपनी ReadFully विधि को भी संशोधित करना चाहेंगे। आपको शुरुआत में input स्ट्रीम पॉइंटर को स्थानांतरित करने की आवश्यकता होगी।

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

धन्यवाद। मैं आज रात कोशिश करूँगा। मैंने एफ़टीपी का उपयोग एज़ूर ब्लोब स्टोरेज ब्रिज से 13 गीगा छवियों को अपलोड किया। मैंने कोशिश की हर फाइल मुझे यह त्रुटि संदेश देता है। मुझे आश्चर्य है कि क्या यह सभी फाइलों को दूषित कर दिया गया है। –

+0

जिसने अपवाद को दूर कर दिया धन्यवाद। एशक्स अभी भी 0 बाइट्स लौट रहा है। booooooo ... –

+1

बस 'readsully()' फ़ंक्शन में 'ms' की स्थिति की जांच करें। सुनिश्चित करें कि यह 0 –

संबंधित मुद्दे