Azure Storage Расчет MD5 не соответствует существующему свойству

Я пытаюсь передать блесну Azure Storage через ashx. В blockBlob.DownloadToStream(memoryStream) он бросает следующее исключение: Microsoft.WindowsAzure.Storage.StorageException: Calculated MD5 does not match existing property

Я знаю, что он нашел правильный blob. Если я помещаю контейнер и путь, которых не существует, вместо этого он дает мне исключение 404.

У меня Googled для подсказок о том, что может вызвать эту ошибку, но ничего полезного не возникает. У кого-нибудь есть мысли о том, что может быть причиной этого? За последние пару дней я переписал этот код несколькими разными способами, но он всегда умирает в 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();
    }
}

Ответ 1

Я смог воссоздать проблему, с которой вы столкнулись. Это происходит, если свойство Content MD5 blob как-то повреждено. У меня был blob с некоторым содержанием MD5 (это было правильно). Затем я программным образом изменил MD5 на другое значение (что неверно). Теперь, когда я вызываю метод 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();
        }
    }

Ответ 2

У меня была эта проблема в моей локальной среде DEV. И похоже, что дБ AzureStorageEmulator испорчено.

Решение (для локальных env!):

  • сбросьте эмулятор базы данных (например, AzureStorageEmulatorDb57)
  • запустите AzureStorageEmulator.exe init -sqlinstance . (вам может потребоваться настроить имя экземпляра)
  • запустить AzureStorageEmulator.exe start
  • перезапустите приложение, чтобы оно получило новый обработчик для эмулятора