Je construis une application qui doit permettre aux utilisateurs de télécharger de grandes images (jusqu'à environ 100 Mo) vers le service Windows Azure Blob Storage. Ayant lu Rob Gillen's excellent article sur l'optimisation du téléchargement de fichiers pour Windows Azure, j'ai emprunté son approche pour faire un téléchargement parallèle de blocs de fichiers, en utilisant la méthode CloudBlockBlob.PutBlock() dans une boucle Parallel.For (le code est disponible here). Le problème que j'ai est que chaque fois que j'essaie de télécharger un fichier, je reçois une exception "InvalidMd5" du storage client. Soupçonnant que le problème peut être dans le stockage de développement, j'ai également essayé d'exécuter le code contre mon compte de stockage Azure en direct, mais j'ai eu la même erreur. En regardant le trafic avec Fiddler, je vois que l'en-tête "Content-MD5" est réglé sur un hachage MD5 valide. La description de l'erreur indique que "La valeur MD5 spécifiée dans la requête est invalide La valeur MD5 doit être 128 bits et codée en Base64", mais au meilleur de ma connaissance, la valeur que je vois être envoyée dans Fiddler est valide (par exemple a91c588092cedbdb1b82c2d3786fd509).Comment résoudre une erreur InvalidMd5 renvoyée par le service Windows Azure Blob Storage?
Voici le code que j'utilise pour le calcul du hachage (avec la permission de Rob Gillen):
public static string GetMD5HashFromStream(byte[] data)
{
MD5 md5 = new MD5CryptoServiceProvider();
byte[] retVal = md5.ComputeHash(data);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < retVal.Length; i++)
{
sb.Append(retVal[i].ToString("x2"));
}
return sb.ToString();
}
Et ceci est l'appel réel à PutBlock():
blob.PutBlock(transferDetails[j].BlockId, new MemoryStream(buff), blockHash, options);
J'ai essayé aussi passer le hachage comme ceci:
Convert.ToBase64String(Encoding.UTF8.GetBytes(blockHash))
mais le résultat était le même - "InvalidMd5 "erreur :(
Le hachage MD5 est passé à PutBlock() avec un codage base64 (par ex. YTkxYzU4ODA5MmNlZGJkYjFiODJjMmQzNzg2ZmQ1MDk =) et sans (par exemple a91c588092cedbdb1b82c2d3786fd509) ne semble pas faire de différence.
Rob code évidemment travaillé pour lui et je n'ai vraiment aucune idée de ce qui peut causer le problème dans mon cas. Le seul changement que j'ai apporté au code de Rob est de modifier la méthode d'extension ParallelUpload() pour prendre un Stream au lieu d'un nom de fichier et de déterminer dynamiquement la taille du bloc en fonction de la taille du fichier téléchargé.
S'il vous plaît, si quelqu'un a une idée de la façon de résoudre ce problème, faites le moi savoir! Je serai vraiment reconnaissant! J'ai déjà perdu deux jours en luttant avec ça.