c# - 尽管容器、路径和 uri 正确,Azure 存储 Blob GetBlobs 方法仍失败

标签 c# azure azure-blob-storage

为此,我使用 Azure.Storage.Blobs 版本 12.14...,因为旧版 SDK 已被弃用,并且我们的存储服务代码需要更新。

以下代码(与 Microsoft 文档教程匹配)失败,但不会导致异常。它只是传递给调用者并导致“对象引用未设置为对象的实例。”。

这是一种方法(根据下面 Guarav 的建议进行更新)

public async Task<List<EvaluationImage>> GetImagesFromVirtualFolder(CompanyDataDto? customer)
{
    var images = new List<EvaluationImage>();
    var imageFolderPrefix = $"publicfiles/images/{customer.AzureFolderName}/";
    var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
       ContainerSettings.MainAppContainer);

    try
    {
        await foreach (var blob in containerClient.GetBlobsAsync(prefix: imageFolderPrefix))
        {
            var filename = blob.Name;
            var img = new EvaluationImage
            {
                ImageUrl = $"{containerClient.Uri.AbsoluteUri}/{filename}",
                ImageCaption = GetCaptionFromFilename(filename),
                IsPosterImage = filename.Contains("poster"),
                ImagesForCompany = customer.CompanyName
            };
        }
    }
    catch (RequestFailedException ex)
    {
        Log.Logger.Error(ex.Message);
        throw;
    }

    return images;
}

当代码位于 foreach 循环中时,它会在任何迭代完成之前退出。它落在调用者身上(razor 页面代码后面),然后错误发生在我迭代集合以构建图像标签的页面中。

该方法生成一个有效的容器

container as text

您可以将下面的网址粘贴到浏览器中,它就会下载。 //https://enerteckchemical.blob.core.windows.net/enerteck/publicfiles/images/robsonpty/RobsonCivil_CatR475_CrawlerDozer.jpg

并且该容器中的图像是可检索的(它们是公共(public)的)

one test image from the container

感谢任何帮助。

最佳答案

请对您的代码进行 2 处更改:

  1. 更改以下代码行:
var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
        $"enerteck/publicfiles/images/{customer.AzureFolderName}/");

var containerClient = new BlobContainerClient(ConnectionSettings.PrimaryConnection,
        "enerteck");

因为您的 Blob 容器的名称是 enerteck。之后的所有内容都是 blob 前缀。

  • 通过更改以下代码行将 blob 前缀添加到 GetBlobsAsync 调用:
  • await foreach (var blob in containerClient.GetBlobsAsync())
    

    await foreach (var blob in containerClient.GetBlobsAsync(prefix: $"publicfiles/images/{customer.AzureFolderName}/"));
    

    以便您从名为 publicfiles/images/{customer.AzureFolderName} 的虚拟文件夹中获取 Blob。

    更新

    这是我运行的代码,效果很好:

    var connectionString =
        "DefaultEndpointsProtocol=https;AccountName=account-name;AccountKey=account-key;EndpointSuffix=core.windows.net;";
    
    var containerName = "enerteck";
    var prefix = "publicfiles/images/robsonpty/";
    
    var containerClient = new BlobContainerClient(connectionString,
        containerName);
    
    await foreach (var blob in containerClient.GetBlobsAsync(prefix: prefix))
    {
        Console.WriteLine(blob.Name);
    }
    

    关于c# - 尽管容器、路径和 uri 正确,Azure 存储 Blob GetBlobs 方法仍失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75539796/

    相关文章:

    azure - azure函数应用程序设置连接字符串值中密码中的分号

    Azure - 基于 YAML 的管道中的自定义条件

    azure - 我应该如何使用 WebJobs 在 Azure 托管博客上自动生成 Twitter 链接?

    azure-blob-storage - 为已在其关联存储帐户中的 Blob 创建 Azure 媒体服务 Assets

    html - Azure Blob SAS 和 Cache-Control 确保资源得到缓存

    C# 异常。文件正在被另一个进程使用

    c# - Entity Framework Code First On Insert 方法 Hook

    c# - 在移动应用程序中保存用户 session 的位置

    c# - 有没有办法从 C# CultureInfo 获取标志图像?

    .net - Azure 逻辑应用程序 : How to Send an Email with one or more attachments after getting the content from Blob storage?