2017-01-10 9 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; 
} 

コールは、私はそれがtrueを返すsourcePageBlob.Exists()呼び出す場合は{"The remote server returned an error: (404) Not Found."} を返します。

+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; 
} 
関連する問題