2013-06-13 18 views
3

Я использую этот код для копирования блобов из одной учетной записи в другую ... но это исключает.Как использовать StartCopyFromBlob между разными учетными записями?

var srcAccount = CloudStorageAccount.Parse("connection string 1"); 
var dstAccount = CloudStorageAccount.Parse("connection string 2"); 

var srcBlobClient = srcAccount.CreateCloudBlobClient(); 
var dstBlobClient = dstAccount.CreateCloudBlobClient(); 

foreach (var srcCloudBlobContainer in srcBlobClient.ListContainers()) 
{ 
    var dstCloudBlobContainer = dstBlobClient 
     .GetContainerReference(srcCloudBlobContainer.Name); 

    dstCloudBlobContainer.CreateIfNotExists(); 

    foreach (var srcBlob in srcCloudBlobContainer.ListBlobs()) 
    { 
     if (srcBlob.GetType() == typeof(CloudBlockBlob)) 
     { 
      var srcBlockBlock = (CloudBlockBlob)srcBlob; 
      var dstBlockBlock = dstCloudBlobContainer 
       .GetBlockBlobReference(srcBlockBlock.Name); 

      // throws exception StorageException: 
      // The remote server returned an error: (404) Not Found. 
      dstBlockBlock.StartCopyFromBlob(srcBlockBlock.Uri); 
     } 
    } 
} 

Microsoft заявляет, что копия перекрестной учетной записи поддерживается, но я не могу заставить ее работать.

Что я делаю неправильно?

+0

I может быть стоит отметить для будущих посетителей, что 'StartCopyFromBlob' теперь устаревшим и имеет (я считаю,) были заменены на 'StartCopy' –

ответ

9

Вы можете проверить ACL источника blob контейнера? Если это Private Вам также может понадобиться изменить ACL для Public/Blob или создать URL SAS. Вы можете использовать следующий код, если вы хотите сохранить ACL вашего BLOB-контейнера, как Private и использовать URL SAS:

var srcAccount = CloudStorageAccount.Parse("connection string 1"); 
var dstAccount = CloudStorageAccount.Parse("connection string 2"); 

      var srcBlobClient = srcAccount.CreateCloudBlobClient(); 
      var dstBlobClient = dstAccount.CreateCloudBlobClient(); 

      foreach (var srcCloudBlobContainer in srcBlobClient.ListContainers()) 
      { 
       var dstCloudBlobContainer = dstBlobClient 
        .GetContainerReference(srcCloudBlobContainer.Name); 

       dstCloudBlobContainer.CreateIfNotExists(); 

       //Assuming the source blob container ACL is "Private", let's create a Shared Access Signature with 
       //Start Time = Current Time (UTC) - 15 minutes to account for Clock Skew 
       //Expiry Time = Current Time (UTC) + 7 Days - 7 days is the maximum time allowed for copy operation to finish. 
       //Permission = Read so that copy service can read the blob from source 
       var sas = srcCloudBlobContainer.GetSharedAccessSignature(new SharedAccessBlobPolicy() 
       { 
        SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15), 
        SharedAccessExpiryTime = DateTime.UtcNow.AddDays(7), 
        Permissions = SharedAccessBlobPermissions.Read, 
       }); 
       foreach (var srcBlob in srcCloudBlobContainer.ListBlobs()) 
       { 
        if (srcBlob.GetType() == typeof(CloudBlockBlob)) 
        { 
         var srcBlockBlock = (CloudBlockBlob)srcBlob; 
         var dstBlockBlock = dstCloudBlobContainer 
          .GetBlockBlobReference(srcBlockBlock.Name); 
         //Create a SAS URI for the blob 
         var srcBlockBlobSasUri = string.Format("{0}{1}", srcBlockBlock.Uri, sas); 
         // throws exception StorageException: 
         // The remote server returned an error: (404) Not Found. 
         dstBlockBlock.StartCopyFromBlob(new Uri(srcBlockBlobSasUri)); 
        } 
       } 
      } 
+1

Возможно ли отменить SAS после завершения операции копирования? –

+0

Да, это возможно, однако это немного усложнит ваш код. Для этого SAS необходимо создать с помощью «политики доступа». Что вам нужно сделать, так это создать политику доступа в контейнере-источнике с разрешением «Чтение» и определить дату истечения срока действия SAS непосредственно перед копированием. Поскольку копирование blob является асинхронным процессом, вам необходимо будет следить за ходом операции копирования. После завершения операции копирования вы можете удалить эту политику доступа. Подробнее о политике доступа вы можете прочитать здесь: http://msdn.microsoft.com/en-us/library/windowsazure/ee393341.aspx. –

+0

спасибо за это лаконичное и правильное ответ! – TheZenker

Смежные вопросы