我正在尝试使用 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/