【发布时间】:2020-11-09 18:20:22
【问题描述】:
我正在尝试将我的项目从 Microsoft.WindowsAzure.Storage v9(已弃用)升级到最新的 sdk Azure.Storage.Blobs v12。
我的问题(升级后)是访问 ContentHash 属性。
升级前步骤:
- 将文件上传到 blob
- 从Microsoft.WindowsAzure.Storage.Blob获取
CloudBlob.Properties.ContentMD5提供的上传文件的MD5哈希 - 将计算出的 MD5 哈希值与从 azure 检索到的哈希值进行比较
升级后尝试访问 Azure 正在计算的 MD5 哈希:
1.BlobClient.GetProperties()调用这个方法
2.BlobClient.UploadAsync() 查看BlobContentInfo 响应
两者都返回 ContentHash 为空。 (see my later Question to see why)
我注意到的一个巨大差异是,对于旧的 sdk,我可以告诉存储客户端使用 MD5 计算,如下所示:
CloudBlobClient cloudBlobClient = _cloudStorageAccount.CreateCloudBlobClient();
cloudBlobClient.DefaultRequestOptions.StoreBlobContentMD5 = true;
所以我期待在最新的 sdk 上找到类似于 StoreBlobContentMD5 的东西,但我找不到。
谁能帮我找到解决这个问题的方法?
编辑 1: 我做了一个测试,在天蓝色存储中我没有MD5 hash
上传代码:
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 中找到
【问题讨论】:
-
能否在 Azure 门户中确认 blob 是否具有 ContentHash?以便我们知道问题出在上传还是属性检索上?一旦我们知道问题出在哪里,也许您也可以发布上传和下载代码的示例?
-
我刚刚做了一个测试,在 Azure 存储中我没有 MD5 哈希。
-
添加了一张图片和一个代码 sn-p。 blobResponse.ContentHash 和 blob.GetProperties().ContentHash 均为空。
-
@Cristian 据我所知,如果 blob 服务 api 版本是 2012-02-12 及更高版本,即使请求标头不包含 @987654332,服务器也会在响应标头中返回 MD 哈希@:docs.microsoft.com/en-us/rest/api/storageservices/…
-
是的,我也读过,根据我期望工作的那个文档....我肯定做错了什么,但我找不到什么。