2017-01-10 30 views
2

我遇到了一个问题,我试图将CloudPageBlob复制到不同Azure订阅中的存储帐户。出于某种原因,当我拨打电话,以复制,我一直得到一个404错误:CloudPageBlob StartCopyAsync失败,状态为404

CloudBlobContainer destContainer; 
CloudBlob sourceBlob; 
string destBlobName; 

var sourcePageBlob = sourceBlob as CloudPageBlob; 
if (sourcePageBlob != null) 
{ 
    var destBlob = destContainer.GetPageBlobReference(destBlobName); 
    await destBlob.StartCopyAsync(sourcePageBlob, AccessCondition.GenerateIfExistsCondition(), AccessCondition.GenerateEmptyCondition(), new BlobRequestOptions(), new OperationContext()); 
    return destBlob; 
} 

调用返回{"The remote server returned an error: (404) Not Found."} 但是,如果我把它sourcePageBlob.Exists()返回true

+0

你destConConiner是否存在? 404错误可能是由于此。此外,由于您指定了AccessCondition.GenerateIfExistsCondition(),我认为destBlob也需要存在。为什么不删除此访问条件? –

+0

您可以检查源容器ACL吗?它是'私人'吗? –

+0

是的,源容器是私人的。应该这样吗?我有一个访问键,并能够在源容器上执行操作。 –

回答

6

拥有私有源容器是个问题。您需要获得允许目标存储帐户访问源共享访问URI的共享访问URI。这篇博文解释它:https://alexandrebrisebois.wordpress.com/2013/06/25/copy-blobs-with-startcopyfromblob-and-track-its-progression-using-copystate/

CloudBlobContainer destContainer; 
CloudBlob sourceBlob; 
string destBlobName; 

var sharedAccessUri = GetShareAccessUri(sourceBlob); 
var sourcePageBlob = sourceBlob as CloudPageBlob; 
if (sourcePageBlob != null) 
{ 
    var destBlob = destContainer.GetPageBlobReference(destBlobName); 
    await destBlob.StartCopyAsync(new Uri(sharedAccessUri)); 
    return destBlob; 
} 

private string GetShareAccessUri(CloudBlob sourceBlob) 
{ 
    int validMins = 300; 
    var policy = new SharedAccessBlobPolicy 
    { 
    Permissions = SharedAccessBlobPermissions.Read, 
    SharedAccessStartTime = null, 
    SharedAccessExpiryTime = DateTimeOffset.Now.AddMinutes(validMins) 
    }; 

    var sas = sourceBlob.GetSharedAccessSignature(policy); 
    return sourceBlob.Uri.AbsoluteUri + sas; 
} 
相关问题