2017-01-10 4 views
2

У меня возникает проблема, когда я пытаюсь скопировать CloudPageBlob на учетную запись хранилища, находящуюся в другой подписке Azure. По какой-то причине, когда я делаю вызов для копирования, я продолжаю получать ошибки 404:CloudPageBlob StartCopyAsync не работает со статусом 404

CloudBlobContainer destContainer; 
CloudBlob sourceBlob; 
string destBlobName; 

var sourcePageBlob = sourceBlob as CloudPageBlob; 
if (sourcePageBlob != null) 
{ 
    var destBlob = destContainer.GetPageBlobReference(destBlobName); 
    await destBlob.StartCopyAsync(sourcePageBlob, AccessCondition.GenerateIfExistsCondition(), AccessCondition.GenerateEmptyCondition(), new BlobRequestOptions(), new OperationContext()); 
    return destBlob; 
} 

Вызов возвращает {"The remote server returned an error: (404) Not Found."} Однако, если я позвоню sourcePageBlob.Exists() возвращает true.

+0

Существует ли у вас destContainer? Ошибка 404 может быть из-за этого. Кроме того, поскольку вы указываете AccessCondition.GenerateIfExistsCondition(), я думаю, что destBlob также должен существовать. Почему бы не удалить это условие доступа? –

+0

Не могли бы вы проверить ACL исходного контейнера? Это «Частный»? –

+0

Да, исходный контейнер является приватным. Должно ли это иметь значение? У меня есть ключ доступа к нему и я могу выполнять операции над исходным контейнером. –

ответ

6

Наличие проблемы с контейнером-источником. Вам нужно получить URI общего доступа, который позволит учетной записи целевого хранилища получить доступ к исходному. Этот комментарий в блоге объясняет это: https://alexandrebrisebois.wordpress.com/2013/06/25/copy-blobs-with-startcopyfromblob-and-track-its-progression-using-copystate/

CloudBlobContainer destContainer; 
CloudBlob sourceBlob; 
string destBlobName; 

var sharedAccessUri = GetShareAccessUri(sourceBlob); 
var sourcePageBlob = sourceBlob as CloudPageBlob; 
if (sourcePageBlob != null) 
{ 
    var destBlob = destContainer.GetPageBlobReference(destBlobName); 
    await destBlob.StartCopyAsync(new Uri(sharedAccessUri)); 
    return destBlob; 
} 

private string GetShareAccessUri(CloudBlob sourceBlob) 
{ 
    int validMins = 300; 
    var policy = new SharedAccessBlobPolicy 
    { 
    Permissions = SharedAccessBlobPermissions.Read, 
    SharedAccessStartTime = null, 
    SharedAccessExpiryTime = DateTimeOffset.Now.AddMinutes(validMins) 
    }; 

    var sas = sourceBlob.GetSharedAccessSignature(policy); 
    return sourceBlob.Uri.AbsoluteUri + sas; 
}