ListBlobsSegmentedAsync无法列出软删除Blob的问题咨询
ListBlobsSegmentedAsync无法返回软删除Blob的修复方案
核心排查项
- 代码语法错误:示例代码中
BlobListingDetails.Deleted与后续null参数之间缺失逗号,会造成参数传值错位,实际传入的前缀、列表详情配置完全不符合预期,无法触发软删除Blob的返回逻辑。 - 前置功能未开启:Blob软删除是存储账户级别的可选功能,必须手动启用才会生效。如果未开启软删除,Blob删除后会被直接永久清除,不存在软删除条目可供接口返回,此时修改枚举参数没有任何作用。
- 枚举传值不全:
BlobListingDetails为位标记枚举,仅传入Deleted值无法覆盖软删除Blob关联的快照、版本条目。如果存储账户同时开启了Blob版本管理,软删除操作会生成对应的删除标记版本,必须在枚举中加入版本相关标记才能被正常列出。 - 自定义配置干扰:问题排查阶段不要传入自定义
requestOptions,如果存储账户开启了异地冗余读访问,自定义的位置模式可能将请求路由到数据同步延迟的次要副本,导致软删除条目读取不全。
修正后可运行代码
BlobContinuationToken continuationToken = null; List<IListBlobItem> allBlobList = new List<IListBlobItem>(); do { // 组合枚举值,覆盖软删除Blob关联的所有条目类型 BlobListingDetails listingConfig = BlobListingDetails.Deleted | BlobListingDetails.Snapshots | BlobListingDetails.Versions | BlobListingDetails.Metadata; BlobResultSegment resultSegment = await CloudBlobContainer.ListBlobsSegmentedAsync( prefix: "", useFlatBlobListing: true, blobListingDetails: listingConfig, maxResults: null, currentToken: continuationToken, options: null, operationContext: new OperationContext() ); continuationToken = resultSegment.ContinuationToken; allBlobList.AddRange(resultSegment.Results); } while (continuationToken != null); // 筛选出所有软删除状态的Blob List<CloudBlockBlob> deletedBlobs = allBlobList .OfType<CloudBlockBlob>() .Where(blob => blob.IsDeleted) .ToList();
验证注意事项
接口调用前先进入存储账户的「数据保护」配置页,确认「Blob软删除」功能已启用,且保留周期配置符合预期。如果是刚开启软删除功能,等待1-2分钟让配置在存储集群全局生效后再发起请求,避免配置未同步导致的返回异常。
内容的提问来源于stack exchange,提问作者user19401992
相关产品推荐
相关产品推荐

