2014-09-22 55 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。但是我沒有嘗試從存儲帳戶複製到開發存儲帳戶。但是,如果你沒有頁面斑點,你不必擔心它:)。