2014-09-22 27 views
1

我试图所有的斑复制到不同的存储:如何复制Azure的容器及斑点

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); 
    } 
} 

我能看到&复制方法被调用targetBlob.StartCopyFromBlob(thisBlobUri);

然而斑点上市副本实际上并没有发生。任何想法?

P.S.我正在使用Azure Storage SDK 4.3 &目标存储是开发存储。

编辑2:

对于上述代码远程天青存储复制工作正常。

然而,对于仿真的存储,我得到400错误请求错误,试图创建容器时: targetContainer.CreateIfNotExists();

我模拟的存储版本是3.0,似乎azure SDK &模拟器版本之间存在冲突。

哪个版本的存储客户端库与存储器 模拟器3.0兼容?

回答

2

你得到这个错误的原因的确是因为版本不匹配。如果我没有弄错,存储模拟器版本3.0使用REST API版本2013-08-15,其中最新版本的存储客户端库使用REST API版本2014-02-14(Ref:http://msdn.microsoft.com/en-us/library/azure/dn744252.aspx)。您可以使用较旧版本的存储客户端库。你可以通过Nuget安装适当的版本。

安装,包装WindowsAzure.Storage -Version 3.2.1(编号:http://www.nuget.org/packages/WindowsAzure.Storage/3.2.1)例如,如果你想安装的存储客户端库版本3.2.1,您可以通过以下这样做

请试试看看是否解决了这个问题。

也期待你的代码,我也建议了一些变化:

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

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

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