首页 > 解决方案 > 未在 Azure Blob 存储 v12 中计算 ContentHash

问题描述

继续传奇,这是第一部分:ContentHash 在 Azure.Storage.Blobs v12.xx 中为空

经过大量调试,根本原因似乎是在上传 blob 后未计算内容哈希,因此BlobContentInfoorBlobProperties正在返回空内容哈希,我的整个流程基于从 Azure 接收哈希。

我发现它取决于我调用哪个 HttpRequest 流方法并上传到 azure:

HttpRequest.GetBufferlessInputStream(),不计算内容哈希,即使我进入azure storage explorer,blob的ContentMD5也是空的。

HttpRequest.InputStream()一切都按预期工作。


你知道为什么会有这种不同的行为吗?你知道如何为通过GetBufferlessInputStream方法接收的流接收内容哈希。

所以代码流是这样的:

var stream = HttpContext.Current.Request.GetBufferlessInputStream(disableMaxRequestLength: true)

var container = _blobServiceClient.GetBlobContainerClient(containerName);
var blob = container.GetBlockBlobClient(blobPath);

BlobHttpHeaders blobHttpHeaders = null;
if (!string.IsNullOrWhiteSpace(fileContentType))
{
     blobHttpHeaders = new BlobHttpHeaders()
     {
          ContentType = fileContentType,
     };
}

// retry already configured of Azure Storage API
await blob.UploadAsync(stream, httpHeaders: blobHttpHeaders);

return await blob.GetPropertiesAsync();

在上面的代码片段ContentHash中没有计算,但是如果我改变我从 http 请求中获取流的方式,ContentHash则计算以下片段。

var stream = HttpContext.Current.Request.InputStream

PS我认为它很明显,但是对于旧的sdk,内容哈希是为通过GetBufferlessInputStream方法接收的流计算的

P.S2 您还可以在 github 上找到一个未解决的问题:https ://github.com/Azure/azure-sdk-for-net/issues/14037

P.S3 添加了代码片段

标签: c#asp.netazureazure-storage

解决方案


今天碰到这个。从我的挖掘来看,这似乎是Stream您用于上传的类型的症状,并不是真正的错误。为了为您的 blob 生成散列(在上传之前在客户端完成),它需要读取流。这意味着它需要在生成哈希后将流的位置重置回 0(对于实际的上传过程)。这样做需要能够对流执行 Seek 操作。如果您的流不支持 Seek,那么它看起来不会生成哈希。

要解决此问题,请确保您提供的流支持 Seek ( CanSeek)。如果不是,则使用不同的流/将您的数据复制到一个流中(例如MemoryStream)。另一种方法是让 Blob SDK 的内部为您执行此操作。


推荐阅读