【发布时间】:2020-11-30 18:06:43
【问题描述】:
继续传奇,这是第一部分:ContentHash is null in Azure.Storage.Blobs v12.x.x
经过大量调试,根本原因似乎是 上传 blob 后未计算内容哈希,因此 BlobContentInfo 或 BlobProperties 返回一个空内容哈希,而我的整个流程基于从 Azure 接收哈希。
我发现这取决于我调用哪个 HttpRequest 流方法并上传到 azure:
HttpRequest.GetBufferlessInputStream(),不计算内容hash,即使我进入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();
在上面的代码 sn-p ContentHash 中没有计算,但是如果我改变从 http 请求中获取流的方式,则计算以下 sn-p ContentHash。
var stream = HttpContext.Current.Request.InputStream
附:我认为这很明显,但是对于旧的 sdk,内容哈希是针对 GetBufferlessInputStream 方法接收的流计算的
P.S2 你也可以在 github 上找到一个未解决的问题:https://github.com/Azure/azure-sdk-for-net/issues/14037
P.S3 添加了代码片段
【问题讨论】:
-
你好,关于这个问题你还有什么问题吗?
-
@IvanYang 我对您的解决方法进行了快速测试。现在我正在做一些性能测试,看看是如何受到影响的。
-
请稍后提供任何反馈:)
-
您好,有什么反馈吗?
-
@IvanYang 目前我将进一步了解您提出的解决方案。谢谢!
标签: c# asp.net azure azure-storage