2014-09-22 4 views
1

내가 다른 저장 장치에있는 모든 모양을 복사하려고 오전 : 나는 & 복사 방법 그러나복사하는 방법 푸른 컨테이너 및 물방울

targetBlob.StartCopyFromBlob(thisBlobUri);를 호출되고있는 모양의 목록을 볼 수 있어요

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

복사가 실제로 일어나지 않습니다. 어떤 아이디어?

P. Azure Storage SDK 4.3 & 대상 스토리지는 개발 스토리지입니다.

편집 2 :

코드 위의 원격 푸른 저장 사본 잘 작동합니다. 그러나 에뮬레이트 저장을위한

나는 400 BadRequest 오류가 발생, 컨테이너 만들려고 할 때 targetContainer.CreateIfNotExists를();

에뮬레이트 된 저장소 버전이 3.0입니다. 하늘색 SDK & 에뮬레이터 버전간에 충돌이있는 것으로 보입니다.

어떤 버전의 스토리지 클라이언트 라이브러리가 에뮬레이터 3.0에서 작동합니까?

답변

2

이 오류가 발생하는 이유는 버전 불일치 때문입니다. 내가 잘못하지 않으면 Storage Emulator 버전 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 URL을 만들고 해당 SAS URL을 사용하여 복사하는 것입니다. BLOB 복사본은 비동기식이므로 SAS URL을 7 일 동안 유효하게 유지하는 것이 좋습니다 (복사 작업에 할당 된 최대 시간).
  • 원본 블롭과 타겟 블롭 모두에서 GetBlobReferenceFromServer을 수행하고 있습니다. 이 메소드는 소스 blob에 대해 권장되지 않으므로 실제로 blob을 통해 얻은 각 blob에 대해 네트워크 호출을 수행합니다. 타겟 BLOB가 존재하지 않는 경우,이 메소드는 Not Found (404)을 슬로우하기 때문에, 타겟 BLOB에는 추천하지 않는다.

대신 권장 BLOB 유형 (블록 또는 페이지)으로 나열한 BLOB를 캐스팅 한 다음 SAS URL을 가져 오는 것이 좋습니다. 모든 블롭이 블롭 블롭이라는 것을 알고 있다면, 캐스트를 걱정하지 않고 간단히 블럭 블롭 오브젝트로 변환 할 수 있습니다.

내가 잘 모르는 한 가지 방법은 페이지 얼룩이 복사되는 방법입니다. 스토리지 계정간에 복사 할 때 페이지 BLOB는 페이지 BLOB로 복사됩니다. 그러나 저장소 계정에서 개발 저장소 계정으로 복사를 시도하지 않았습니다. 하지만 페이지 얼룩이 없으면 걱정할 필요가 없습니다. :)

관련 문제