ListBlobs不可用及ListBlobsSegmentedAsync未返回全部Blob目录问题
解决Azure Blob存储的ListBlobs方法找不到和ListBlobsSegmentedAsync返回不完整的问题
问题1:找不到ListBlobs方法,编译不通过
在WindowsAzure.Storage 8.0和.NET Core 1.1环境下,CloudBlobContainer确实提供了同步的ListBlobs方法,你可以从这几个方向排查问题:
- 确认命名空间引用:务必在代码顶部添加
using Microsoft.WindowsAzure.Storage.Blob;,Blob相关的核心类型和方法都在这个命名空间下。 - 检查变量类型:确保你的
blobs变量是CloudBlobContainer类型,而不是CloudBlobClient或其他类型。比如要先通过客户端正确获取容器实例:
只有CloudStorageAccount storageAccount = CloudStorageAccount.Parse(yourConnectionString); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = blobClient.GetContainerReference("level1");CloudBlobContainer实例才会包含ListBlobs方法。 - 同步API的兼容性:.NET Core 1.1对部分Azure存储同步API的支持有限,虽然WindowsAzure.Storage 8.0理论上兼容,但更推荐使用异步版本(也就是你尝试的
ListBlobsSegmentedAsync),同步方法可能存在隐藏的兼容性问题。如果坚持用同步方法,要确保WindowsAzure.StorageNuGet包是8.0.x的稳定版本。
问题2:ListBlobsSegmentedAsync仅返回10个结果
这是因为ListBlobsSegmentedAsync是分段获取结果的机制:单次调用只会返回一部分数据(即使你指定了maxResults=20000,Azure Blob服务的最大单次返回数量是5000,超过会自动截断;如果当前页结果更少,就返回实际数量),同时会返回一个ContinuationToken,用于获取下一页的数据。你只调用了一次,所以只拿到了第一页的10个结果。
正确的做法是循环调用直到ContinuationToken为null,示例代码如下:
BlobContinuationToken continuationToken = null; List<IListBlobItem> allItems = new List<IListBlobItem>(); do { // 调用分段获取方法,maxResults设为5000(服务允许的最大值) var segmentResult = await blobs.ListBlobsSegmentedAsync( false, BlobListingDetails.None, 5000, continuationToken, null, null); // 将当前页结果加入总列表 allItems.AddRange(segmentResult.Results); // 更新续令牌,用于下一次循环 continuationToken = segmentResult.ContinuationToken; } while (continuationToken != null); // 续令牌为空时,说明所有数据已获取完毕
额外提醒:
- 第一个参数
useFlatBlobListing设为false时,只会列出当前层级的内容(符合你获取level21下子文件夹的需求);设为true会递归列出所有层级的Blob和文件夹。 - 确保容器和目标路径的权限配置正确,避免因权限问题导致内容无法被列出。
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

