Azure存储计算的MD5与现有属性不匹配

时间:2013-12-12 14:36:49

标签: c# asp.net azure azure-storage

我正在尝试通过ashx传递Azure存储blob。在 blockBlob.DownloadToStream(memoryStream)上,它抛出以下异常:Microsoft.WindowsAzure.Storage.StorageException: Calculated MD5 does not match existing property

我知道它找到了正确的blob。如果我放入一个不存在的容器和路径,那么它会给我一个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();
    }
}

3 个答案:

答案 0 :(得分:6)

我能够重现你所面临的问题。如果blob的Content MD5属性以某种方式损坏,则会发生这种情况。我有一个含有一些内容MD5的blob(这是正确的)。然后我以编程方式将MD5更改为其他值(这是不正确的)。现在,当我在blob上调用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();
        }
    }

答案 1 :(得分:1)

我在本地DEV环境中遇到此问题。似乎AzureStorageEmulator的db已损坏。

解决方案(适用于本地环境!)

  • 删除模拟器的数据库(例如AzureStorageEmulatorDb57
  • 运行AzureStorageEmulator.exe init -sqlinstance .(您可能需要自定义实例名称)
  • 运行AzureStorageEmulator.exe start
  • 重新启动应用程序,以便它向模拟器提供新的处理程序

答案 2 :(得分:1)

我有同样的问题。我使用了 var x = document.getElementById("A").textContent; var y = document.getElementById("B").textContent; if (x.includes(y)) { console.log('yes') } }。在此link中进行了描述。 MD5错误消息现在消失了。