azure - 如何在不同帐户之间使用StartCopyFromBlob?

标签 azure azure-storage azure-blob-storage

我正在使用此代码将 blob 从一个帐户复制到另一个帐户...但它会引发异常。

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

微软声明支持跨帐户复制,但我无法让它工作。

我做错了什么?

最佳答案

您可以检查源 blob 容器的 ACL 吗?如果是 Private,您可能需要将 ACL 更改为 Public/Blob 或创建 SAS URL。如果您希望将 Blob 容器的 ACL 保留为私有(private)并使用 SAS URL,可以使用以下代码:

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

关于azure - 如何在不同帐户之间使用StartCopyFromBlob?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17081415/

相关文章:

azure - 从 Azure Key Vault 访问多个 key 作为数据源

azure - 无法获取 Azure Devops Workitem 布局

Azure 存储 - 公开具有文件结构的容器

azure - 使用 Azure Storage Rest API 创建文件夹而不创建默认 blob 文件

azure - 为什么 Fluentd Azure blob 插件在 kubernetes 中不起作用

WordPress 主题 git 部署到 windows azure

azure - 微软动力 : Generate Refresh Token for OAuth

python - 将输出文件从 Azure Batch 移动到 Data Lake

rest - Azure 表服务 REST API : JSON format is not supported

c# - 执行 BlobClient.UploadAsync 时出现 HttpRequestException