2013-12-12 20 views
7

Azure Storage blobをashxに渡そうとしています。 blockBlob.DownloadToStream(memoryStream)それは以下の例外をスローしています。Microsoft.WindowsAzure.Storage.StorageException: Calculated MD5 does not match existing propertyAzure Storage計算されたMD5が既存のプロパティと一致しません

正しいブロブを見つけることがわかりました。存在しないコンテナとパスを入れた場合、代わりに404例外が返されます。

私はこのエラーの原因になっている可能性があるヒントについてはGoogleで検索しましたが、何も役立つものはありません。誰かがこれを引き起こしている可能性のあることについて考えを持っていますか?私はこのコードを過去数日間にいくつか書き直しましたが、それは常に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(); 
    } 
} 

答えて

6

あなたが直面している問題を再現することができました。これは、BLOBのContent MD5プロパティが何らかの形で破損している場合に発生します。私はいくつかの内容のMD5(それは正しい)とブロブを持っていた。その後私はプログラムによってMD5を他の値に変更しました(これは間違っています)。今、私はブロブでDownloadToStream()メソッドを呼び出すと、私はまったく同じエラーを取得します。

あなたは以下のコードに示すようBlobRequestOptionstrueDisableContentMD5Validationを設定することにより、このチェックを回避することができます

  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

ありがとうございます。私は今夜​​これを試してみましょう。私はAzure BLOBストレージブリッジにFTPを使って13ギガの画像をアップロードしました。試したすべてのファイルにこのエラーメッセージが表示されます。これがすべてのファイルを壊してしまったのだろうかと思います。 –

+0

は例外を除外しました。 ashxはまだ0バイトを返すだけです。 booooooo ... –

+1

あなたの 'ReadFully()'関数で 'ms'の位置をチェックするだけです。それが0になっていることを確認してください。 –

関連する問題