如何复制Azure容器&;斑点
本文关键字:容器 amp 斑点 Azure 何复制 复制 | 更新日期: 2023-09-27 18:24:08
我正试图将所有Blob复制到不同的存储:
CloudBlobClient srcblobClient = sourceStorageAccount.CreateCloudBlobClient();
CloudBlobClient targetBlobClient = targetStorageAccount.CreateCloudBlobClient();
foreach (CloudBlobContainer cont in srcblobClient.ListContainers())
{
foreach (IListBlobItem srcBlob in cont.ListBlobs(useFlatBlobListing: true))
{
var targetContainer = targetBlobClient.GetContainerReference(cont.Name);
targetContainer.CreateIfNotExists();
Uri thisBlobUri = srcBlob.Uri;
var serverBlob = srcblobClient.GetBlobReferenceFromServer(thisBlobUri);
ICloudBlob targetBlob = targetContainer.GetBlobReferenceFromServer(serverBlob.Name);
targetBlob.StartCopyFromBlob(thisBlobUri);
}
}
我可以看到blobs&正在调用复制方法targetBlob.StartCopyFromBlob(thisBlobUri);
然而,复制实际上并没有发生。有什么想法吗?
附言:我正在使用Azure存储SDK 4.3&目标存储是开发存储。
编辑2:
对于远程azure存储副本,上面的代码运行良好。
但是,对于模拟存储,当尝试创建容器时,我收到400 BadRequest错误:targetContainer.CreateIfNotExists();
我的模拟存储版本是3.0,看起来azure SDK&模拟器版本。
哪个版本的存储客户端库与存储配合良好模拟器3.0?
出现此错误的原因确实是版本不匹配。如果我没有记错的话,Storage Emulator版本3.0使用REST API版本2013-08-15
,其中作为存储客户端库的最新版本,使用REST API版本2014-02-14
(参考:http://msdn.microsoft.com/en-us/library/azure/dn744252.aspx)。您可以使用旧版本的存储客户端库。您可以通过Nuget安装适当的版本。例如,如果要安装Storage Client Library版本3.2.1,可以执行以下操作:
安装软件包WindowsAzure.Storage-版本3.2.1(参考:http://www.nuget.org/packages/WindowsAzure.Storage/3.2.1)
请尝试一下,看看这是否能解决问题。
同时查看您的代码,我还建议进行一些更改:
- 我不建议将Blob容器的权限更改为
Public
。它在某种程度上公开了您的blob存储,并通过匿名访问使其可用。我建议您在源Blob上使用Read Permission
创建SAS URL,并使用这些SAS URL进行复制。由于blob复制是异步的,我建议将SAS URL的有效期保持7天(分配给复制操作的最长时间) - 我看到您正在对源blob和目标blob执行
GetBlobReferenceFromServer
。对于源blob,不建议使用此方法,因为它实际上会进行网络调用,因此对于您已经通过列表获得的每个blob。不建议在目标blob上使用此方法,因为如果您的目标blob不存在,此方法将抛出Not Found (404)
相反,我建议您将通过列表获得的blob转换为适当的blob类型(Block或Page),然后获得SAS URL。如果您知道所有的Blob都是块Blob,那么您可以简单地将它们投射到CloudBlockBlob对象中,而无需担心投射。
有一件事我不确定,那就是页面斑点将如何被复制。在存储帐户之间进行复制时,页面blob会被复制为页面blob。但是,我还没有尝试从存储帐户复制到开发存储帐户。但是,如果你没有页面斑点,你就不必担心:)。