Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/276.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/11.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# 存储blob复制操作期间出错-在实体的当前状态下不允许请求的操作_C#_Azure_Azure Storage Blobs - Fatal编程技术网

C# 存储blob复制操作期间出错-在实体的当前状态下不允许请求的操作

C# 存储blob复制操作期间出错-在实体的当前状态下不允许请求的操作,c#,azure,azure-storage-blobs,C#,Azure,Azure Storage Blobs,我有下面的方法将数据复制到目标存储blob private static async Task MoveMatchingBlobsAsync(IEnumerable<ICloudBlob> sourceBlobRefs, CloudBlobContainer sourceContainer, CloudBlobContainer destContainer) { foreach (ICloudBlob sourceBlobRef

我有下面的方法将数据复制到目标存储blob

private static async Task MoveMatchingBlobsAsync(IEnumerable<ICloudBlob> sourceBlobRefs, 
           CloudBlobContainer sourceContainer, 
           CloudBlobContainer destContainer)
{
   foreach (ICloudBlob sourceBlobRef in sourceBlobRefs)
   {
      if (sourceBlobRef.Properties.ContentType != null)
      {
       // Copy the source blob
       CloudBlockBlob destBlob = destContainer.GetBlockBlobReference(sourceBlobRef.Name);

       try
       {
           //exception throwed here  - StartCopyAsync
           await destBlob.StartCopyAsync(new Uri(GetSharedAccessUri(sourceBlobRef.Name, sourceContainer))); /

           ICloudBlob destBlobRef = await destContainer.GetBlobReferenceFromServerAsync(sourceBlobRef.Name);
           while (destBlobRef.CopyState.Status == CopyStatus.Pending)
           {
                 Console.WriteLine($"Blob: {destBlobRef.Name}, Copied: {destBlobRef.CopyState.BytesCopied ?? 0} of  {destBlobRef.CopyState.TotalBytes ?? 0}");
                 await Task.Delay(500);
                 destBlobRef = await destContainer.GetBlobReferenceFromServerAsync(sourceBlobRef.Name);
            }
            Console.WriteLine($"Blob: {destBlob.Name} Complete");
          }
          catch (Exception e)
          {
               Console.WriteLine($"Blob: {destBlob.Name} Copy Failed");
           }
          }
        }
      }
这将只迭代2个级别,但不会动态迭代到内部级别。我在下面的层次结构中有blob

  --Container
    --FolderA
      --FolderAA
        --FolderAA1
          --File1.txt
          --File2.txt              
        --FolderAA2
          --File1.txt
          --File2.txt
        --FolderAA3
     --FolderAB
       --File8.txt
     --FolderAC
       --File9.txt
这种层次结构是动态的


附加问题:是否有任何GUI工具可以将blob数据复制到目标存储帐户

更新

根据您的描述,我在官方示例代码中对其进行了修改。已经可以将一个容器中的数据完全复制到另一个帐户,并且代码已上载到Github

要使用此示例代码,您需要修改
App.Config
文件。生产环境的正式使用需要完善

PRIVIOUS

您可以参考中的代码进行复制操作。如果本文中的解决方案对您没有帮助,请让我知道,我将继续跟进,帮助您解决问题

u can download是复制数据的GUI工具


在哪一行代码上出现异常?更新的问题您可以通过Fiddler跟踪请求/响应吗?这将为您提供有关错误的更多详细信息。
是否有任何GUI工具可将blob数据复制到目标存储帐户?
-您可以使用Microsoft storage Explorer或Cerulean(披露:我正在开发Cerulean)。是的,您指定的帖子是我自己的问题,并遵循相同的解决方案。但不幸的是,现在在“复制”到目的地时出现了一个错误。@kudlatiger我自己已经尝试成功了。我还将我的演示代码放在Github中。您的函数是正确的,可能是项目中的其他函数错误。我在官方的示例代码中使用了你的函数,它是有效的,希望对你有用。如果您运行我的代码但也失败了,可能需要
更改门户中的访问级别
,然后重试。您能将源存储和目标存储放在不同的Azure订阅中吗?@kudlatiger很高兴为您提供帮助^-^
     private static string GetSharedAccessUri(string blobName, CloudBlobContainer container)
    {
        DateTime toDateTime = DateTime.Now.AddMinutes(60);

        SharedAccessBlobPolicy policy = new SharedAccessBlobPolicy
        {
            Permissions = SharedAccessBlobPermissions.Read,
            SharedAccessStartTime = null,
            SharedAccessExpiryTime = new DateTimeOffset(toDateTime)
        };

        CloudBlockBlob blob = container.GetBlockBlobReference(blobName);
        string sas = blob.GetSharedAccessSignature(policy);

        return blob.Uri.AbsoluteUri + sas;
    }
  --Container
    --FolderA
      --FolderAA
        --FolderAA1
          --File1.txt
          --File2.txt              
        --FolderAA2
          --File1.txt
          --File2.txt
        --FolderAA3
     --FolderAB
       --File8.txt
     --FolderAC
       --File9.txt