【问题标题】:ContentHash is null in Azure.Storage.Blobs v12.x.xAzure.Storage.Blobs v12.x.x 中的 ContentHash 为空
【发布时间】:2020-11-09 18:20:22
【问题描述】:

我正在尝试将我的项目从 Microsoft.WindowsAzure.Storage v9(已弃用)升级到最新的 sdk Azure.Storage.Blobs v12。

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

升级前步骤:

  1. 将文件上传到 blob
  2. Microsoft.WindowsAzure.Storage.Blob获取CloudBlob.Properties.ContentMD5提供的上传文件的MD5哈希
  3. 将计算出的 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/…
  • 是的,我也读过,根据我期望工作的那个文档....我肯定做错了什么,但我找不到什么。

标签: c# azure


【解决方案1】:

总结结束问题:

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

根据操作员的评论,这可能是由于现有解决方案存在一些问题。在创建新解决方案后,它按预期工作。

【讨论】:

  • 对不起,这不再是这个问题的解决方案。经过一段时间的调试,我找到了它的路由原因。在这里你可以找到新帖子:stackoverflow.com/questions/63351999/…
  • @Cristian,我看到了新案例,您能否提供一个示例工作代码?
【解决方案2】:

这个问题的short version是,确保你使用SDK v12版本上传到Azure的Stream支持Seek(见HasSeek属性)。目前需要它来遍历 Stream 以生成哈希,并将位置重置/查找回 0,以便可以再次读取它以进行实际上传。

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 1970-01-01
    • 1970-01-01
    • 2022-08-02
    • 2021-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    相关资源
    最近更新 更多