Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何复制Azure容器&;斑点_C#_Azure - Fatal编程技术网

C# 如何复制Azure容器&;斑点

C# 如何复制Azure容器&;斑点,c#,azure,C#,Azure,我正在尝试将所有Blob复制到不同的存储: CloudBlobClient srcblobClient = sourceStorageAccount.CreateCloudBlobClient(); CloudBlobClient targetBlobClient = targetStorageAccount.CreateCloudBlobClient(); foreach (CloudBlobContainer cont in srcblobClient.ListContainers())

我正在尝试将所有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的列表&正在调用copy方法
targetBlob.startcopyfromflob(thisBlobUri)

然而,复制并没有真正发生。有什么想法吗

另外,我正在使用Azure Storage SDK 4.3&目标存储是开发存储

编辑2:

对于远程azure存储,上面的代码可以正常工作

但是,对于模拟存储,在尝试创建容器时,我收到了400 BADDREQUEST错误: targetContainer.CreateIfNotExists()

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

哪个版本的存储客户机库适合于存储 emulator 3.0


出现此错误的原因确实是因为版本不匹配。如果我没有弄错的话,Storage Emulator 3.0版使用REST API版本
2013-08-15
,其中最新版本的存储客户端库使用REST API版本
2014-02-14
(参考:)。您可以使用较旧版本的存储客户端库。您可以通过Nuget安装适当的版本。例如,如果要安装存储客户端库版本3.2.1,可以通过执行以下操作来完成:

安装WindowsAzure.Storage软件包-版本3.2.1(参考:)

请尝试一下,看看这是否解决了问题

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

  • 我不建议将Blob容器上的权限更改为
    Public
    。它会公开blob存储,并通过匿名访问使其可用。我建议您在源Blob上创建具有
    读取权限的SAS URL,并使用这些SAS URL进行复制。由于blob拷贝是异步的,我建议将SAS URL保持有效7天(为拷贝操作分配的最长时间)
  • 我看到您正在对源blob和目标blob执行
    GetBlobReferenceFromServer
    。对于源blob,不建议使用此方法,因为它实际上会对已通过列表获得的每个blob进行网络调用。不建议在目标blob上使用此方法,因为如果目标blob不存在,此方法将抛出一个
    notfound(404)
相反,我建议您将通过列表获得的blob转换为适当的blob类型(块或页面),然后获取SAS URL。如果您知道所有blob都是块blob,那么您可以简单地将它们强制转换为CloudBlockBlob对象,而不必担心转换

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