问题描述
有时候我有一个案例,从一个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。