azure-storage - Azure 存储资源管理器未列出所有 Blob
问题描述
当我在 Azure 存储资源管理器中打开 Blob 容器时,有时它仅列出容器包含的 Blob 的子集。如何让它列出所有这些?我尝试刷新,搜索 blob name prefix,没有任何帮助。遗憾的是,源代码目前不可用,除了它是一个 Electron 应用程序之外,我没有找到任何关于其内部工作的信息,因此很难从这个方向深入研究问题。
我无法重现该问题,它只是不时弹出。目前,我正在使用一个容器,其中存储资源管理器仅列出一个 169 KB 的文件,并在底部显示“显示 1 到 1 个缓存项目”,但是当我单击工具栏中的文件夹统计信息按钮时,活动窗口显示“ devstoreaccount1/palecblobcontainer 的统计信息:5 blob;588,270 字节(不包括快照) ”。
当我使用 REST API 列出 blob时,我得到了所有这些。即我http://127.0.0.1:10000/devstoreaccount1/palecblobcontainer?restype=container&comp=list
在我的浏览器中查看,所有 5 个 blob 都列在生成的 XML 中。我通过单击存储资源管理器工具栏中的复制 URL、删除 blob 的路径并添加查询字符串来获取容器的 URL。
我不仅使用 Storage Emulator 观察到这一点,甚至使用实际的 Azure Storage 也观察到了这一点。每次我遇到这个问题时,即使在 Storage Explorer 重新启动和删除,%AppData%\StorageExplorer
甚至在分离和重新附加 storage account之后,它仍然存在,所以似乎缓存不是问题。我在 GitHub 上发现了一个与分页相关的类似问题,但在我的情况下,观察到的计数是一致的并且非常低,因此所有 blob 都适合一页。
一旦停止显示一些 blob,如何使存储资源管理器再次工作?如果是错误,是否有解决方法?有没有一种合理的方法可以让我更深入地研究这个问题?我在 Windows 10 上使用存储资源管理器 1.8.1。
解决方案
Storage Explorer 在后台使用 REST API。打开或刷新 Blob 容器时,请求路径为/devstoreaccount1/palecblobcontainer?restype=container&comp=list&maxresults=1000&delimiter=%2F
.
就我而言,问题在于URL 编码的斜杠delimiter=%2F
在哪里。%2F
如果没有该参数,API 响应将包含所有 blob,但如果包含该参数,则仅返回存储资源管理器中列出的 blob。
当我在容器的根目录中上传另一个文件(任意 desktop.ini)时,它看起来像这样:
- http://127.0.0.1:10000/devstoreaccount1/palecblobcontainer//.safe(列出)
- http://127.0.0.1:10000/devstoreaccount1/palecblobcontainer//404(未列出)
- http://127.0.0.1:10000/devstoreaccount1/palecblobcontainer//404.safe(未列出)
- http://127.0.0.1:10000/devstoreaccount1/palecblobcontainer//chci-vuz-skoda(未列出)
- http://127.0.0.1:10000/devstoreaccount1/palecblobcontainer//index(未列出)
- http://127.0.0.1:10000/devstoreaccount1/palecblobcontainer/desktop.ini(列出)
当我删除 .safe blob 时,会列出 404 blob(并且 desktop.ini 仍会列出)。当我删除 404 时,会列出 404.safe。当我重命名404.safe
为 时404.safe_
,列出了 chci-vuz-skoda。
列出包含具有空名称的子文件夹的文件夹时,API 不会列出空名称文件夹,而是显示其第一个 blob。这可能是 REST API(或下面的一些代码)的错误。我不确定这是否是列表的错误,或者空段是否会导致此类 blob 的上传失败。我没有设法使用存储资源管理器创建这样的 blob,并且blob 名称限制的文档没有谈到这些限制。
要使用存储资源管理器处理空名称文件夹中的 blob,请来回重命名它们。这会将它们从空名称文件夹移动到其父文件夹(即压缩 blob 名称中的斜杠序列)。但是,这会更改 blob 名称,因此必须更新存储的 blob 名称副本和依赖于 blob 名称的任何代码。
我使用Fiddler观察了请求和响应。存储资源管理器 > 编辑 > 配置代理 > 使用自定义代理设置(URL:http: //127.0.0.1,端口:8888)并运行 Fiddler。还有 Storage Explorer > Help > Toggle Developer Tools (F12),它显示了应用程序的 Chrome 开发者工具,但是 Network 选项卡没有显示请求,我不想深入挖掘。
推荐阅读
- mysql - 为什么在 MySQL 触发器查询中出现语法错误?
- php - 使用 where 子句获取加密数据
- python - 如何使用 Google 的 Universal Sentence Encoder 根据多个文档找到最相似的文档?
- c# - Unity 下载问题 WWW 和 UnityWebRequest
- tcl - 在 tcl 中创建目录的问题
- node.js - 数据库上的firebase once('value')函数没有响应
- javascript - 如何为使用箭头函数的类方法的参数生成 jsdoc?
- docker - 当用户 linux docker image 没有问题,但 windows docker image 失败
- php - 仅用破折号替换被空格包围的连字符
- xml - 无法从 XSD 文件生成 XML