Azure 如何在不同帐户之间使用StartCopyFromBlob?
我正在使用此代码将blob从一个帐户复制到另一个帐户。。。但它抛出了一个例外Azure 如何在不同帐户之间使用StartCopyFromBlob?,azure,azure-storage,azure-storage-blobs,Azure,Azure Storage,Azure Storage Blobs,我正在使用此代码将blob从一个帐户复制到另一个帐户。。。但它抛出了一个例外 var srcAccount = CloudStorageAccount.Parse("connection string 1"); var dstAccount = CloudStorageAccount.Parse("connection string 2"); var srcBlobClient = srcAccount.CreateCloudBlobClient(); var dstBlobClient =
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声明支持跨帐户复制,但我无法使其正常工作
我做错了什么?能否检查源blob容器的ACL?如果是私有的,您可能需要将ACL更改为公共的,或者创建SAS URL。如果希望将blob容器的ACL保持为私有,并使用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));
}
}
}
复制操作完成后是否可以取消SAS?是的,可以这样做,但会使代码复杂一点。为此,必须使用
访问策略创建SAS
。您需要做的是在源容器上创建一个具有Read
权限的访问策略,并在复制之前定义SAS过期日期。由于复制blob是一个异步过程,因此需要监视复制操作的进度。复制操作完成后,可以删除该访问策略。您可以在此处阅读有关访问策略的更多信息:。您好,这篇文章似乎很旧,但我在存储帐户之间复制blob时也遇到了问题。有趣的是,在同一个存储帐户内复制时,拷贝工作正常。关于SAS-我真的需要SAS来执行复制操作吗?我可能需要提醒未来的访问者,StartCopyFromBlob
现在已被弃用,并且(我相信)已被StartCopy