Rob,感谢您提供帮助并指出 MD5 哈希值的差异。你的回答让我朝着正确的方向思考。我又花了一整天的时间来研究这个问题,但幸运的是(并且感谢你的评论:))我终于成功解决了这个问题。事实证明,我的案例实际上存在两个问题:
1) MD5 哈希值:我注意到您在答案中粘贴的哈希值比我得到的哈希值短,但我花了一段时间才看到您的答案是否正确twice更短。经过一些实验我发现从流中获取MD5Hash()您的测试应用程序中的方法正在转换16-byte生成的哈希值MD5加密服务提供者 to a 32 个字符细绳。正是这个 32 个字符的字符串导致了问题,因为它被转换为Base64并传递给PutBlock()方法,因此 Blob 存储服务抱怨的哈希值更长且无效。这是我最终得到的代码:
原来的:
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();
}
以及对 PutBlock() 的调用:
// calculate the block-level hash
string blockHash = Helpers.GetMD5HashFromStream(buff);
blob.PutBlock(transferDetails[j].BlockId, new MemoryStream(buff), blockHash, options);
Final:
MD5 md5 = new MD5CryptoServiceProvider();
byte[] blockHash = md5.ComputeHash(buff);
string convertedHash = Convert.ToBase64String(blockHash, 0, 16);
blob.PutBlock(transferDetails[j].BlockId, new MemoryStream(buff), convertedHash, options);
Rob,我真的很好奇你的代码在你的情况下是如何工作的,为什么在我的情况下却不起作用——这是否是我机器上的设置所特有的,或者可能是不同版本的 Azure 工具(我使用的是 v1.1)。 2)...如果您有任何想法,请告诉我。
2) 开发存储中的一个错误: 大量的网络梳理让我发现这一页 http://msdn.microsoft.com/en-us/library/dd320275.aspx其中提到了开发存储中一个不起眼但显然已知的错误:
如果两个请求尝试上传
阻止尚未执行的 blob
存在于开发存储中,一
请求将创建 blob,并且
其他可能返回状态代码 409
(冲突),与存储服务
错误代码 BlobAlreadyExists。
以下是我想出的解决方法:
public static bool IsDevelopmentStorageRunning()
{
return new Microsoft.ServiceHosting.Tools.DevelopmentStorage.DevStore().IsRunning();
}
您需要添加对Microsoft.ServiceHosting.Tools.dll,它位于“C:\Program Files\Windows Azure SDK\v1.2\bin“在我的机器上。然后,我在并行.For处理文件块的循环如下:
bool isDevStorageRunning = StorageProxy.IsDevelopmentStorageRunning();
ParallelOptions parallelOptions = new ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = isDevStorageRunning ? 1 : 4;
Parallel.For(0, transferDetails.Length, parallelOptions, j => { ... });
我希望这能帮别人省去我所经历的所有麻烦。罗布,再次感谢您的帮助:)