【问题标题】:Copy page blob from one storage account to Another storage account using .Net API startCopy使用 .Net API startCopy 将页面 blob 从一个存储帐户复制到另一个存储帐户
【发布时间】:2016-10-14 17:45:42
【问题描述】:

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

我希望 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

【问题讨论】:

  • 您所包含的只是您的堆栈跟踪,而不是您进行的实际调用。请编辑以显示您如何调用StartCopy()。 (显然掩盖了真实的存储帐户名称/密钥)。另外,请说明您如何确认源路径有效。

标签: azure azure-blob-storage


【解决方案1】:

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

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

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

【讨论】:

    【解决方案2】:

    您可以尝试使用data movement library。具体来说:

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

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

    我已经验证,当 sourcetarget 在不同的帐户中并且两个访问策略都是“私人”时,这可以工作。

    【讨论】:

      猜你喜欢
      • 2021-08-25
      • 2021-06-27
      • 1970-01-01
      • 2015-10-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-25
      相关资源
      最近更新 更多