c# - Azure.Storage.Blobs v12.x.x 中的 ContentHash 为 null

标签 c# azure

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

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

升级前步骤:

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

升级后尝试访问 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: 我做了一个测试,在 azure 存储中我没有 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 中的新类之外,旧上传代码和新上传代码没有太大区别。

主要区别仍然是我已经说过的,我在新的 sdk 中找不到 StoreBlobContentMD5 的等效设置。 我认为这就是问题所在。我需要设置存储客户端来计算 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存储包进行了快速测试,可以看到content-md5是自动生成的,并且可以读取。

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

关于c# - Azure.Storage.Blobs v12.x.x 中的 ContentHash 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62996395/

相关文章:

c# - 返回 Excel 变量 C#

c# - 添加到数组

c# - Entity Framework 6 代码优先并发

c# - 查找 WCF 服务调用方的 Active Directory 域用户名

c# - 在 C# 中包装包含固定大小 C 数组的结构

asp.net - 我应该将 docker 与应用程序服务一起使用,而不是直接使用应用程序服务吗?

python - 从 msrestazure.azure_active_directory 导入(ModuleNotFoundError : No module named 'msrestazure'

带有 Servicebus 绑定(bind)异常的 Azure Function

azure - 控制多个实例中的azure辅助角色并发

azure - 托管私有(private) Conda 包 - URL 包含查询字符串