为什么CloudBlockBlob.Startcopyblob仅复制0个字节?

问题描述

有时候我有一个案例,从一个Blob复制到输入资产Blob仅复制0个字节... 第一次尝试后我正在重试,并且也将其延迟80秒,但没有任何变化... 该文件是视频文件,大小为340mb ...如果大家需要任何信息,我可以回复...

 private async Task CreateInputAssetBlobAsync(UploadRequest request)
        {
            var cloudBlobContainer = new CloudBlobContainer(request.InputAssetStorageUri);
            var blockBlob = cloudBlobContainer.GetBlockBlobReference(request.BlobName);

            var storageCredentials = new Microsoft.Azure.Storage.Auth.StorageCredentials(_apiAccess.TempBlobAccountName,_apiAccess.TempBlobContainerKey);
            var tempBlobContainer = new CloudBlobContainer(new Uri(_apiAccess.TempBlobContainerAddress),storageCredentials);
            var tempBlockBlob = tempBlobContainer.GetBlockBlobReference(request.BlobName);

            try
            {
                await blockBlob.StartCopyAsync(tempBlockBlob);
                
                do
                {
                    if (blockBlob.CopyState.Status == CopyStatus.Pending)
                        await Task.Delay(1000);
                    await blockBlob.FetchAttributesAsync();
                }
                while (blockBlob.CopyState.Status != CopyStatus.Success);

                await blockBlob.FetchAttributesAsync();
                if (blockBlob.Properties.Length <= 0)
                {
                    Task.Delay(80000);

                    await blockBlob.StartCopyAsync(tempBlockBlob);
                   
                    do
                    {
                        if (blockBlob.CopyState.Status == CopyStatus.Pending)
                            await Task.Delay(1000);
                        await blockBlob.FetchAttributesAsync();
                    }
                    while (blockBlob.CopyState.Status != CopyStatus.Success);
                }
               
                return;
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
                throw;
            }
        }

解决方法

您可能希望在此处查看Azure Blob API的“备注”部分 https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob

StartCopy blob有几点注意事项。

  • “ Blob服务会尽力复制blob。”
  • “对于块Blob或附加Blob,Blob服务会在从该操作返回之前创建一个长度为零的提交Blob。”
  • “对于所有Blob类型,您可以在目标Blob上调用Get Blob或Get Blob属性以检查复制操作的状态。复制完成后,将提交最后一个Blob。”

如果存储帐户中的副本从未完成,我建议您打开支持凭单,其中包含存储帐户,时间和操作ID等详细信息。

希望有些帮助。

,

注意:您不应使用

do
{
    if (blockBlob.CopyState.Status == CopyStatus.Pending)
       await Task.Delay(1000);
    await blockBlob.FetchAttributesAsync();
 }
 while (blockBlob.CopyState.Status != CopyStatus.Success);

但是

do
{
   await Task.Delay(1000);
   await blockBlob.FetchAttributesAsync();
}
while (blockBlob.CopyState.Status == CopyStatus.Pending);

否则,如果副本有错误,您将获得无限循环。 可能这是您的情况吗?

,

在有效的代码中,我看到一旦启动副本,便检索了一个新的CloudBlockBlob对象。添加第二行:

await tempBlockBlob.StartCopyAsync(blockBlob);
tempBlockBlob = (CloudBlockBlob)await tempBlobContainer.GetBlobReferenceFromServerAsync(request.BlobName);

,然后执行fetchattribute并使用tempBlockBlob检查。如果不添加第二行,我将得到一个0字节的blob。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...