【问题标题】:Azure.Storage.Blobs returns different list from WindowsAzure.Storage on creationAzure.Storage.Blobs 在创建时返回与 WindowsAzure.Storage 不同的列表
【发布时间】:2022-01-21 23:54:24
【问题描述】:

我有这个测试代码,它使用相同的凭据以两种方式连接到 Azure Blob 存储,一次使用现已弃用的 WindowsAzure.Storage 包,一次使用新的 Azure.Storage.Blobs 包:

using Azure.Storage.Blobs;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;
using NUnit.Framework;
using System.Linq;

namespace EntityFrameworkTest
{
    public class AzureBlobStorageTests
    {

        [Test]
        public void TestStorage()
        {
            string storageAccount = "MyConnectionString";
            string containerName = "testazureblobobjectstore";

            var clientNew = new BlobServiceClient(storageAccount);
            var containerNew = clientNew.GetBlobContainerClient(containerName);
            containerNew.CreateIfNotExists();
            var blobsListNew = containerNew.GetBlobs();

            var accountOld = CloudStorageAccount.Parse(storageAccount);
            var clientOld = accountOld.CreateCloudBlobClient();
            var containerOld = clientOld.GetContainerReference(containerName);
            containerOld.CreateIfNotExistsAsync().GetAwaiter().GetResult();
            BlobContinuationToken config = new BlobContinuationToken();
            var blobsListOld = containerOld.ListBlobsSegmentedAsync(config).GetAwaiter().GetResult().Results;
            
            Assert.AreEqual(blobsListOld.Count(), blobsListNew.Count());
        }
    }
}

两个列表的长度不同:

blobsListOld我有2个项目:

  1. 目录
  2. 一个名为__id__fooBlockBlob

blobsListNew我有3个项目,都是BlockBlobs,名字如下:

  1. //||!@#$%^&*()_-=+[]'<>~;:`?
  2. /||!@#$%^&*()_-=+[]'<>~;:`?
  3. __id__foo

谁能给我解释一下?

【问题讨论】:

    标签: azure-blob-storage


    【解决方案1】:

    我尝试在我的系统中测试使用已弃用的WindowsAzure.Storage 包和新的Azure.Storage.Blobs 包连接到 Azure Blob 存储的 blob 的返回计数:两者都返回相同的值。

    试试这个代码

                string storageAccount = "Connection String";
                string containerName = "test";
    
                var clientNew = new BlobServiceClient(storageAccount);
                var containerNew = clientNew.GetBlobContainerClient(containerName);
                containerNew.CreateIfNotExists();
                
                BlobContainerClient containerClient = clientNew.GetBlobContainerClient("test");
                // List all blobs in the container using new 
                await foreach (BlobItem blobItem in containerClient.GetBlobsAsync())
                {
                    Console.WriteLine("\t" + blobItem.Name);
                }
    
                var accountOld = CloudStorageAccount.Parse(storageAccount);
              
                CloudBlobClient clientOld = accountOld.CreateCloudBlobClient();
                
                CloudBlobContainer container = clientOld.GetContainerReference("test");
               //List all blobs using old 
    
                CloudBlobDirectory dira = container.GetDirectoryReference(string.Empty);
                
                var rootDirFolders = dira.ListBlobsSegmentedAsync(true, BlobListingDetails.Metadata, null, null, null, null).Result;
    
                foreach (var blob in rootDirFolders.Results)
                {
                    Console.WriteLine( blob.Uri);
                }
    

    输出

    【讨论】:

    • 我看到你已经改变了旧部分的工作方式,而我想了解如何更改新代码以使其工作或多或少相同,所以我希望看到 __id__foo阻止 blob 并将其作为唯一的块 blob。
    • 您能否解释一下__id__foo 是容器名称还是blob 名称?以及你真正想知道什么
    • 它应该是唯一的块 Blob,但它不是我使用新包运行时的方式。
    • 是的,你试过上面的答案代码吗?您的文件夹结构在 azure 存储中的外观如何?
    • 如果答案对您有帮助,您可以接受它作为答案(单击答案旁边的复选标记,将其从灰色切换为已填充。)。这对其他社区成员可能是有益的。谢谢
    【解决方案2】:

    显然我不得不使用containerNew.GetBlobsByHierarchy(delimiter: "/"); 来仅获取根文件夹中的 blob。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多