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
- перезапустите приложение, чтобы оно получило новый обработчик для эмулятора