如何在只有 StartCopyFromBlob() 的 Azure SDK 中实现单个 blob 的同步复制?

How do I implement synchronous copying of a single blob in Azure SDK that only has StartCopyFromBlob()?

早期版本的 Azure SDK 有 CloudBlob.CopyFromBlob(),它是同步的,我们在代码中使用它。我们现在需要转移到 SDK 2.4,那里没有这样的方法,取而代之的是 CloudBlockBlob.StartCopyFromBlob() returns 一些我们可以用来检查复制是如何完成的魔法标记。

在我们的代码中 "background" 复制 blob 是没有意义的 - 同步复制就可以了,所以最好能以某种方式实现与旧 CopyFromBlob() 等效的功能来自较新 SDK 的内容。

这是我的方法:

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath);
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri);
while( true ) {
    System.Threading.Thread.Sleep(100);
    CloudBlockBlob target = targetContainer.GetBlockBlobReference(targetPath);
    bool greatSuccess = false;
    switch( target.CopyState.Status ) {
        case CopyStatus.Success:
            greatSuccess = true;
            break;
        case CopyStatus.Pending:
            continue;
        default:
            throw new Exception( "Failed to copy" );
    }
    if( success ) {
        break;
    }
}

它看起来工作正常,但我不确定其中是否存在潜在问题。

使用 StartCopyFromBlob() 然后等待复制完成的惯用方法是什么?

如果复制操作针对同一存储帐户和同一类型(示例 -> 块 blob 到块 blob 在同一存储帐户中复制),复制是同步的,您可以预期复制操作已完成StartCopyFromBlob() returns。您还可以通过检查 targetBlob.CopySate 值是否成功来验证它。

CloudBlockBlob sourceBlob = sourceContainer.GetBlockBlobReference(sourcePath);
CloudBlockBlob targetBlob = targetContainer.GetBlockBlobReference(targetPath);
var copyToken = targetBlob.StartCopyFromBlob(sourceBlob.Uri);
if(targetBlob.CopyState.Status == CopyStatus.Success)
{
    // Copy completed successfully
}

对于所有其他场景(跨存储帐户甚至同一存储帐户内的不同类型)复制操作是异步的,并使用后台的备用资源来执行。目前,服务没有提供关于复制速度的 SLA。如果您希望在这些情况下保持一致的行为,最好的选择是让客户端自己复制 - 从源下载数据并上传到目标。