Azure.Storage.Blobs.BlobServiceClient CopyFromUri() 在返回最新的 ETag 之前似乎没有完成复制

标签 azure azure-blob-storage

我正在尝试使用 StartCopyFromUri 或 StartCopyFromUriAsync 将 blob 从一个存储帐户复制到另一个存储帐户。即使 status.HasCompleted 当我尝试通过

获取 ETag 时
1. var etag = await _siteStorageClient.GetBlobETag(containerPath, asset.BlobName);
 //this is the response from WaitForCompletionAsync
2. var etag = complete.GetRawResponse().Headers.Where(x => x.Name == "ETag").FirstOrDefault().Value;

我尝试了这两种方法,但都返回一个 Etag,该 Etag 与我通过 Azure 门户登录时 Blob 属性中显示的内容不匹配。当执行 Etag 检查时,几乎就像文件没有完成复制(或竞争条件)一样。我在 github 上找不到该 SDK 的任何使用示例。

有什么想法可能会出错吗?

这是一个类似的问题,但使用的是较旧的 SDK。 How to copy a blob from one container to another container using Azure Blob storage SDK

//Storage class
public async Task<CopyFromUriOperation> CopyFile(string containerName, string blobName, Uri sourceUri)
            {
                var container = _blobServiceClient.GetBlobContainerClient(containerName);
                var blockBlobClient = container.GetBlockBlobClient(blobName);
    
                //Made this the synchronous version try and block 
                //this is the target client
                var status =  await blockBlobClient.StartCopyFromUriAsync(sourceUri);
    
                while(!status.HasCompleted)
                {      
                    //Per Documentation this calls UpdateStatusAsync() periodically
                    //until status.HasCompleted is true
                    await status.WaitForCompletionAsync();
                }        
                return status;             
            }


    //Calling Code
    
    var status = await _siteStorageClient.CopyFile(container,BlobName, sasUri);
    var etag = await _siteStorageClient.GetBlobETag(container, BlobName);

最佳答案

经过几次尝试和故障排除后,我能够使其正常工作。它只会发生在 Azure 环境中,而不会发生在本地运行 Web 应用程序时。

最初,status.WaitForCompletionAsync() 位于循环内,我开始收到套接字错误。我相信它被调用太多次并导致端口耗尽(此时只是猜测)。

但这就是现在正在发挥作用的方法。

public async Task<CopyFromUriOperation> CopyFile(string containerName, string blobName,Uri sourceUri)
        {
            var container = _blobServiceClient.GetBlobContainerClient(containerName);
            var blockBlobClient = container.GetBlockBlobClient(blobName);

            var status =  await blockBlobClient.StartCopyFromUriAsync(sourceUri);

            await status.WaitForCompletionAsync();

            while(status.HasCompleted == false)
            {
                await Task.Delay(100);          
            }

            return status;
        }

关于Azure.Storage.Blobs.BlobServiceClient CopyFromUri() 在返回最新的 ETag 之前似乎没有完成复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65860383/

相关文章:

python - 出现错误 : [Errno 95] Operation not supported while writing zip file in databricks

android - 在 Android 中取消订阅 Azure 通知中心标签

azure - 如果 Azure 存储帐户是本地或地理冗余的,为什么要备份它?

azure - 下载 Azure Blob 存储上的容器

azure - Azure 表中的排名

angular - 是否可以从 Angular 获取 AAD 访问 token ?

Azure 经典云服务配置本地与云

asp.net - 如何在 ASP.net MVC 应用程序中隔离用户数据?

Azure blob 错误 :The specified blob does not exist, 但 Blob 存在

node.js - createBlockBlobFromText 方法的最大文本大小 Azure 存储、NodeJS