如何复制Azure容器&;斑点

本文关键字:容器 amp 斑点 Azure 何复制 复制 | 更新日期: 2023-09-27 18:24:08

我正试图将所有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);
    }
}

我可以看到blobs&正在调用复制方法targetBlob.StartCopyFromBlob(thisBlobUri);

然而,复制实际上并没有发生。有什么想法吗?

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

编辑2:

对于远程azure存储副本,上面的代码运行良好。

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

我的模拟存储版本是3.0,看起来azure SDK&模拟器版本。

哪个版本的存储客户端库与存储配合良好模拟器3.0?

如何复制Azure容器&;斑点

出现此错误的原因确实是版本不匹配。如果我没有记错的话,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-版本3.2.1(参考:http://www.nuget.org/packages/WindowsAzure.Storage/3.2.1)

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

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

  • 我不建议将Blob容器的权限更改为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类型(Block或Page),然后获得SAS URL。如果您知道所有的Blob都是块Blob,那么您可以简单地将它们投射到CloudBlockBlob对象中,而无需担心投射。

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