gpt4 book ai didi

c# - 如何复制 Azure 容器和 Blob

转载 作者:行者123 更新时间:2023-12-03 01:54:56 24 4
gpt4 key购买 nike

我正在尝试将所有 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);
}
}

我能够看到 blob 列表,并且正在调用复制方法 targetBlob.StartCopyFromBlob(thisBlobUri);

但是复制实际上并没有发生。有什么想法吗?

附注我正在使用 Azure Storage SDK 4.3,目标存储是开发存储。

编辑2:

对于远程 azure 存储副本,上述代码工作正常。

However for Emulated storage I get 400 BadRequest error, when trying to create container: targetContainer.CreateIfNotExists();

我的模拟存储版本是3.0,azure SDK和模拟器版本之间似乎存在冲突。

Which version of storage client library works well with storage emulator 3.0?

最佳答案

您收到此错误的原因确实是因为版本不匹配。如果我没记错的话,存储模拟器版本 3.0 使用 REST API 版本 2013-08-15 ,而最新版本的存储客户端库使用 REST API 版本 2014-02-14 >(引用:http://msdn.microsoft.com/en-us/library/azure/dn744252.aspx)。您可以使用旧版本的存储客户端库。您可以通过 Nuget 安装合适的版本。例如,如果您想要安装存储客户端库版本 3.2.1,您可以通过执行以下操作来完成:

Install-Package WindowsAzure.Storage -Version 3.2.1 (Ref: http://www.nuget.org/packages/WindowsAzure.Storage/3.2.1)

请尝试一下,看看是否可以解决问题。

另外查看您的代码,我还建议进行一些更改:

  • 我不建议将 Blob 容器的权限更改为Public。它会公开您的 blob 存储并通过匿名访问使其可用。我建议您在源 blob 上创建具有读取权限的 SAS URL,并使用这些 SAS URL 进行复制。由于 Blob 复制是异步的,因此我建议将 SAS URL 的有效期保持在 7 天(为复制操作分配的最大时间)。
  • 我发现您正在对源 blob 和目标 blob 执行 GetBlobReferenceFromServer。不建议对源 blob 使用此方法,因为它实际上会针对您已通过列表获得的每个 blob 进行网络调用。不建议在目标 blob 上使用此方法,因为如果您的目标 blob 不存在,此方法将抛出 Not Found (404)

相反,我建议您将通过列表获得的 blob 转换为适当的 blob 类型( block 或页面),然后获取 SAS URL。如果您知道所有 blob 都是 block blob,则可以简单地将它们转换为 CloudBlockBlob 对象,而不必担心转换。

我不确定的一件事是如何复制页面 blob。当您在存储帐户之间复制时,页面 blob 将被复制为页面 blob。但是我还没有尝试从存储帐户复制到开发存储帐户。但如果您没有页面 blob,则不必担心:)。

关于c# - 如何复制 Azure 容器和 Blob,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25983482/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com