使用.Net API startCopy将页面blob从一个存储帐户复制到另一个存储帐户

时间:2016-10-14 17:45:42

标签: azure azure-storage-blobs

我正在尝试使用.net API startCopy将一个存储帐户中的页面blob复制到另一个存储帐户。两个存储帐户都是标准类型,并且blob存在于源位置。我在下面的异常细节中收到“couldverifysourcepath”错误。

我希望startcopy API能够从帐户复制到另一个帐户。谁能帮助我弄清楚这里的问题是什么?

Exception- Microsoft.WindowsAzure.Storage.StorageException: The remote server returned an error: (404) Not Found. ---> System.Net.WebException: The remote server returned an error: (404) Not Found.
   at System.Net.HttpWebRequest.GetResponse()
   at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
   --- End of inner exception stack trace ---
   at Microsoft.WindowsAzure.Storage.Core.Executor.Executor.ExecuteSync[T](RESTCommand`1 cmd, IRetryPolicy policy, OperationContext operationContext)
   at Microsoft.WindowsAzure.Storage.Blob.CloudBlob.StartCopy(Uri source, AccessCondition sourceAccessCondition, AccessCondition destAccessCondition, BlobRequestOptions options, OperationContext operationContext)
   at Microsoft.WindowsAzure.Storage.Blob.CloudPageBlob.StartCopy(CloudPageBlob source, AccessCondition sourceAccessCondition, AccessCondition destAccessCondition, BlobRequestOptions options, OperationContext operationContext)
Request Information
RequestID:1a82f5b6-0001-008f-7328-26bec1000000
RequestDate:Fri, 14 Oct 2016 14:35:31 GMT
StatusMessage:The specified resource does not exist.
ErrorCode:CannotVerifyCopySource

2 个答案:

答案 0 :(得分:1)

要跨存储帐户复制blob,源Blob必须可公开访问。请检查源blob容器上的ACL,看看它是否为Private

如果源blob容器的ACL为Private,则有两种可能的解决方案:

  1. 在源blob上创建一个Shared Access Signature (SAS),其权限至少为Read,有效期至少为15天,并使用该SAS URL(blob URL + SAS令牌)作为复制源。
  2. 不推荐,但您可以将源blob容器的ACL更改为Blob。这将使源blob可公开访问。在这种情况下,您的代码应该按原样运行。

答案 1 :(得分:0)

您可以尝试使用data movement library。具体做法是:

await TransferManager.CopyAsync(source, target, false);

boolean参数指定这是否是服务端异步副本。如果是,则在复制完成之前可以完成本地任务。

我已经确认,当sourcetarget位于不同的帐户且两个访问政策都是“私有”时,此方法有效。