有时候我有一个案例,从一个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;
}
}
答案 0 :(得分:0)
您可能希望在此处查看Azure Blob API的“备注”部分 https://docs.microsoft.com/en-us/rest/api/storageservices/copy-blob
StartCopy blob有几点注意事项。
如果存储帐户中的副本从未完成,我建议您打开支持凭单,其中包含存储帐户,时间和操作ID等详细信息。
希望有些帮助。
答案 1 :(得分:0)
注意:您不应使用
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);
否则,如果副本有错误,您将获得无限循环。 可能这是您的情况吗?
答案 2 :(得分:0)
在有效的代码中,我看到一旦启动副本,便检索了一个新的CloudBlockBlob对象。添加第二行:
await tempBlockBlob.StartCopyAsync(blockBlob);
tempBlockBlob = (CloudBlockBlob)await tempBlobContainer.GetBlobReferenceFromServerAsync(request.BlobName);
,然后执行fetchattribute并使用tempBlockBlob检查。如果不添加第二行,我将得到一个0字节的blob。