Rya*_*eze 11 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();
}
}
Run Code Online (Sandbox Code Playgroud)
我能够重现你面临的问题.如果Content MD5blob 的属性以某种方式被破坏,则会发生这种情况.我有一个含有一些内容MD5的blob(这是正确的).然后我以编程方式将MD5更改为其他值(这是不正确的).现在当我在blob上调用DownloadToStream()方法时,我得到完全相同的错误.
您可以通过设置DisableContentMD5Validation为truein 来绕过此检查,BlobRequestOptions如下面的代码所示:
BlobRequestOptions options = new BlobRequestOptions()
{
DisableContentMD5Validation = true,
};
blockBlob.DownloadToStream(memoryStream, null, options);
Run Code Online (Sandbox Code Playgroud)
尝试一下,它应该工作.
另外,您可能还想修改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();
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3041 次 |
| 最近记录: |