【问题标题】:Azure Storage Calculated MD5 does not match existing propertyAzure 存储计算的 MD5 与现有属性不匹配
【发布时间】:2013-12-31 00:45:57
【问题描述】:

我正在尝试通过 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();
    }
}

【问题讨论】:

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


    【解决方案1】:

    我能够重现您面临的问题。如果 blob 的 Content MD5 属性以某种方式损坏,则会发生这种情况。我有一个带有一些内容 MD5 的 blob(这是正确的)。然后我以编程方式将 MD5 更改为其他值(这是不正确的)。现在,当我在 blob 上调用 DownloadToStream() 方法时,我得到了完全相同的错误。

    您可以通过在BlobRequestOptions 中将DisableContentMD5Validation 设置为true 来绕过此检查,如下代码所示:

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

    【讨论】:

    • 谢谢。我今晚试试这个。我使用 FTP 将 13 个演出的图像上传到 Azure Blob 存储桥。我尝试的每个文件都会给我这个错误消息。我想知道这是否是损坏所有文件的原因。
    • 这让异常消失了,谢谢。 ashx 仍然只是返回 0 个字节。呜呜呜……
    • 在你的ReadFully()函数中查看ms的位置即可。确保它也是 0。
    • 啊,我找到了。我的代码中还有另一个错误。我需要 ReadFully(memoryStream) 而不是流式传输。那只是一些空的 MemoryStream 对象。现在可以了!非常感谢您的帮助和快速回复。 ;)
    【解决方案2】:

    我在本地 DEV 环境中遇到了这个问题。而且AzureStorageEmulator 的数据库似乎已损坏。

    解决方案(针对本地环境!):

    • 删除模拟器的数据库(例如AzureStorageEmulatorDb57)
    • 运行AzureStorageEmulator.exe init -sqlinstance .(您可能需要自定义实例名称)
    • 运行AzureStorageEmulator.exe start
    • 重新启动应用程序,因此它会为模拟器获取一个新的处理程序

    【讨论】:

    • 从哪里放置模拟器数据库。没有得到步骤。请详细说明
    • @Preeti - 模拟器在您的本地 SQL Server 实例上创建一个数据库。在第一次初始化期间,您必须指定 SQL 实例,以便模拟器可以存储这些数据。在上面的步骤中点“。”表示“默认本地 sql server 实例”。
    • 停止一切并删除模拟器数据库,然后重新启动应用程序就是我需要做的。它会自动启动模拟器并自动重新创建 emulatorDb 和 VOILA,没有更多错误!谢谢!
    【解决方案3】:

    我遇到了同样的问题。我用AzureStorageEmulator.exe init -forcecreate。在此link 中进行了描述。 MD5 错误信息现已消失。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2017-06-11
      • 1970-01-01
      相关资源
      最近更新 更多