ContentHash is null in Azure.Storage.Blobs v12.x.x



我正试图将我的项目从Microsoft.WindowsAzure.Storagev9(已弃用(升级到最新的sdkAzure.Sorage.Blobsv12。

我的问题(升级后(是访问ContentHash属性。

升级前步骤:

  1. 上传文件到blob
  2. Microsoft.WindowsAzure.Storage.Blob获取CloudBlob.Properties.ContentMD5提供的上传文件的MD5哈希
  3. 将计算出的MD5哈希与从azure中检索到的哈希进行比较

升级后尝试访问Azure正在计算的MD5哈希:

1.BlobClient.GetProperties()调用此方法

2.BlobClient.UploadAsync()查看BlobContentInfo响应

两个returnContentHash都为null。(请参阅我稍后的问题,了解原因(

我注意到的一个巨大的区别是,使用较旧的sdk,我可以告诉存储客户端使用MD5计算,如下所示:

CloudBlobClient cloudBlobClient = _cloudStorageAccount.CreateCloudBlobClient();
cloudBlobClient.DefaultRequestOptions.StoreBlobContentMD5 = true;

因此,我希望在最新的sdk上找到类似于StoreBlobContentMD5的东西,但我做不到。

有人能帮我找到解决这个问题的办法吗?

编辑1:我做了一个测试,在azure存储中我没有MD5哈希

上传代码:

var container = _blobServiceClient.GetBlobContainerClient(containerName);
var blob = container.GetBlobClient(blobPath);
BlobHttpHeaders blobHttpHeaders = null;
if (!string.IsNullOrWhiteSpace(fileContentType))
{
blobHttpHeaders = new BlobHttpHeaders()
{
ContentType = fileContentType,                   
};                
}
StorageTransferOptions storageTransferOption = new StorageTransferOptions()
{
MaximumConcurrency = 2,
};
var blobResponse = await blob.UploadAsync(stream, blobHttpHeaders, null, null, null, null, storageTransferOption, default);
return blob.GetProperties();

除了使用新sdk中的新类之外,旧的上传代码和新的上传代码没有太大区别。

主要的区别仍然是我已经说过的,我在StoreBlobContentMD5的新sdk中找不到等效的设置。我认为这就是问题所在。我需要将存储客户端设置为计算MD5哈希,就像我对旧的sdk所做的那样。

编辑2:下载时,我可以这样做:

var properties = blob.GetProperties();
var download = await blob.DownloadAsync(range: new HttpRange(0, properties.Value.ContentLength), rangeGetContentHash: true);

通过使用DownloadAsync的这个定义,我可以强制计算MD5哈希,它可以在download.Value.ContentHash中找到

总结以结束问题:

我用最新版本的12.4.4 blob存储包做了一个快速测试,我可以看到内容-md5是自动生成的,也可以读取。

根据专栏的评论,这可能是由于现有解决方案的一些问题。在创建了一个新的解决方案之后,它就可以按预期工作了。

这个问题的简短版本是,确保使用v12版本的SDK上传到Azure的Stream支持Seek(请参阅HasSeek属性(。目前需要它来遍历流以生成哈希,并将位置重置/查找回0,以便在实际上传时可以再次读取它。

最新更新