如何解决Azure.Storage.Blobs.BlobServiceClient CopyFromUri() 在返回最新的 ETag 之前似乎没有完成复制
我正在尝试使用 StartCopyFromUri 或 StartCopyFromUriAsync 将 Blob 从一个存储帐户复制到另一个。即使 status.HasCompleted 当我尝试通过
获取 ETag1. 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;
我尝试了这两种方法,当我通过 Azure 门户登录时,这两种方法都返回了与 blob 属性中显示的不匹配的 Etag。当执行 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;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。