【问题标题】:Azure BlobBatchClient.DeleteBlobsAsync always return 404 blob not foundAzure BlobBatchClient.DeleteBlobsAsync 始终返回 404 blob not found
【发布时间】:2021-09-03 00:00:41
【问题描述】:

我在尝试批量删除容器中的 blob 时遇到了一种非常奇怪的行为。具有以下代码(请注意,出于简洁和安全原因,省略或编辑了某些代码):

var blobServiceClient = GetAzureBlobServiceClient();
var container = await BuildAzureContainer(blobServiceClient);

var blobsToBeDeleted = new List<Uri>();

var thumbImage = removedMedia.Path.GetThumbImageName();
blobsToBeDeleted.Add(new Uri("https://account-name.blob.core.windows.net/container-name/blob-name"));

if (!string.IsNullOrEmpty(thumbImage))
{
    blobsToBeDeleted.Add(new Uri("https://account-name.blob.core.windows.net/container-name/thumbs/blob-name"));
}

if (blobsToBeDeleted.Any())
{
    var batch = blobServiceClient.GetBlobBatchClient();
    await batch.DeleteBlobsAsync(blobsToBeDeleted, DeleteSnapshotsOption.IncludeSnapshots);
}

使用Azure.Storage.Blobs(12.9.0) 和Azure.Storage.Blobs.Batch(12.6.0) 就在我尝试进行批量删除之前,我正在将图像上传到 Azure 并确认它们已上传并存在于容器中。 Azure 的响应是:

System.AggregateException: 2 batch operation(s) failed. (The specified blob does not 
exist.
RequestId: **removed**
Time:2021-06-18T08:16:15.2409894Z
Status: 404 (The specified blob does not exist.)
ErrorCode: BlobNotFound

还尝试使用以下方法获取 Uri:

container.GetBlobClient("blob-name").Uri

或

container.GetBlobClient("thumbs/blob-name}").Uri

它也返回一个正确的 url,但没有运气。

我已经检查过,我添加到列表中的 URL 与 Azure 中的活动 URL 完全相同。无论我在做什么,响应都是一样的——所有批处理操作都返回BlobNotFound。例如,如果对相同的 blob 执行以下操作:

BlobClient blob = container.GetBlobClient("container-name/blob-name");
await blob.DeleteAsync(DeleteSnapshotsOption.IncludeSnapshots);

blob 已成功删除。我真的在为此苦苦挣扎,找不到导致这种行为的原因,尤其是当我能够删除相同的 blob 但不能批量删除时。我是否遗漏了什么或 SDK 发生了什么问题? 决定在 GitHub 开新问题之前先写到这里。

任何帮助将不胜感激。

附:我确信这在几个月前还有效,唯一改变的是 NuGet 包更新。

【问题讨论】:

标签: c# azure azure-blob-storage


【解决方案1】:

我自己做了一些测试,如果你为batch.DeleteBlobsAsync指定DeleteSnapshotsOption.IncludeSnapshots来删除没有快照的blob,你会得到一个404错误。

所以恐怕你需要在批量删除之前检查 blob 是否有快照。

【讨论】:

  • 你说的太对了。没想到这会成为问题。刚刚测试并确认 - 如果没有可用的快照,DeleteBlobsAsync() 应该在没有 DeleteSnapshotsOption.IncludeSnapshots 的情况下调用
  • 有趣!所以我尝试了同样的方法,无论它们是否有快照,我都能够批量删除 blob。我的代码虽然使用的是 Node SDK。我将尝试使用 .Net SDK。
猜你喜欢
  • 2016-03-16
  • 2021-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-01
  • 2017-06-08
  • 2020-01-28
相关资源
最近更新 更多