c# - 未在 Azure Blob 存储 v12 中计算 ContentHash
问题描述
继续传奇,这是第一部分:ContentHash 在 Azure.Storage.Blobs v12.xx 中为空
经过大量调试,根本原因似乎是在上传 blob 后未计算内容哈希,因此BlobContentInfo
orBlobProperties
正在返回空内容哈希,我的整个流程基于从 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 添加了代码片段
解决方案
今天碰到这个。从我的挖掘来看,这似乎是Stream
您用于上传的类型的症状,并不是真正的错误。为了为您的 blob 生成散列(在上传之前在客户端完成),它需要读取流。这意味着它需要在生成哈希后将流的位置重置回 0(对于实际的上传过程)。这样做需要能够对流执行 Seek 操作。如果您的流不支持 Seek,那么它看起来不会生成哈希。
要解决此问题,请确保您提供的流支持 Seek ( CanSeek
)。如果不是,则使用不同的流/将您的数据复制到一个流中(例如MemoryStream
)。另一种方法是让 Blob SDK 的内部为您执行此操作。