【问题标题】:How to Copy Azure Containers & Blobs如何复制 Azure 容器和 Blob
【发布时间】:2014-11-16 23:22:46
【问题描述】:

我正在尝试将所有 blob 复制到不同的存储:

CloudBlobClient srcblobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient targetBlobClient = targetStorageAccount.CreateCloudBlobClient();

foreach (CloudBlobContainer cont in srcblobClient.ListContainers())
{
    foreach (IListBlobItem srcBlob in cont.ListBlobs(useFlatBlobListing: true))
    {                        
        var targetContainer = targetBlobClient.GetContainerReference(cont.Name);
        targetContainer.CreateIfNotExists();

        Uri thisBlobUri = srcBlob.Uri;
        var serverBlob = srcblobClient.GetBlobReferenceFromServer(thisBlobUri);

        ICloudBlob targetBlob = targetContainer.GetBlobReferenceFromServer(serverBlob.Name);

        targetBlob.StartCopyFromBlob(thisBlobUri);
    }
}

我可以看到正在调用 blob 和复制方法的列表targetBlob.StartCopyFromBlob(thisBlobUri);

但是复制实际上并没有发生。有什么想法吗?

附:我正在使用 Azure Storage SDK 4.3,目标存储是开发存储。

编辑 2:

对于上述代码的远程天蓝色存储副本工作正常。

但是,对于模拟存储,我在尝试创建容器时收到 400 BadRequest 错误: targetContainer.CreateIfNotExists();

我的模拟存储版本是3.0,好像azure SDK和模拟器版本有冲突。

哪个版本的存储客户端库适用于存储 模拟器3.0?

【问题讨论】:

    标签: c# azure


    【解决方案1】:

    您收到此错误的原因确实是因为版本不匹配。如果我没记错的话,Storage Emulator 3.0 版使用 REST API 版本 2013-08-15,而最新版本的存储客户端库使用 REST API 版本 2014-02-14(参考:http://msdn.microsoft.com/en-us/library/azure/dn744252.aspx)。您可以使用旧版本的存储客户端库。您可以通过 Nuget 安装适当的版本。例如,如果您要安装 Storage Client Library 版本 3.2.1,您可以通过以下方式进行:

    安装包 WindowsAzure.Storage -Version 3.2.1(参考:http://www.nuget.org/packages/WindowsAzure.Storage/3.2.1

    请尝试一下,看看是否能解决问题。

    同时查看您的代码,我还建议进行一些更改:

    • 我不建议将 Blob Container 的权限更改为 Public。它有点暴露您的 blob 存储,并通过匿名访问使其可用。我建议您在源 blob 上使用 Read Permission 创建 SAS URL,并使用这些 SAS URL 进行复制。由于 blob 复制是异步的,我建议保持 SAS URL 的有效期为 7 天(分配给复制操作的最长时间)。
    • 我看到您正在对源 blob 和目标 blob 执行 GetBlobReferenceFromServer。不建议对源 blob 使用此方法,因为它实际上会为您通过列表获得的每个 blob 进行网络调用。不建议在目标 blob 上使用此方法,因为如果您的目标 blob 不存在,此方法将抛出 Not Found (404)

    相反,我建议您将通过列表获得的 blob 转换为适当的 blob 类型(块或页面),然后获取 SAS URL。如果您知道所有的 blob 都是块 blob,则可以简单地将它们转换为 CloudBlockBlob 对象,而无需担心转换。

    我不确定的一件事是如何复制页面 blob。在存储帐户之间进行复制时,页 Blob 将被复制为页 Blob。但是我没有尝试从存储帐户复制到开发存储帐户。但是,如果您没有页面 blob,则不必担心 :)。

    【讨论】:

      猜你喜欢
      • 2018-06-01
      • 2020-01-12
      • 2016-09-21
      • 2011-12-25
      • 2020-03-29
      • 2016-01-27
      • 2017-11-21
      • 2019-03-25
      相关资源
      最近更新 更多