C# 存储blob复制操作期间出错-在实体的当前状态下不允许请求的操作
我有下面的方法将数据复制到目标存储blobC# 存储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
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