快速入门:适用于 .NET 的 Azure Blob 存储客户端库

适用于 .NET 的 Azure Blob 存储客户端库入门。 Azure Blob 存储是适用于云的 Azure 的对象存储解决方案,针对存储海量非结构化数据进行了优化。

API 参考文档 | 库源代码 | 包 (NuGet) | 示例

先决条件

设置

本部分逐步指导如何准备一个项目,使其与适用于 .NET 的 Azure Blob 存储客户端库配合使用。

创建项目

使用 .NET CLI 或 Visual Studio 2022 创建 .NET 控制台应用。

  1. 在 Visual Studio 顶部,导航到“文件”>“新建”>“项目”。

  2. 在对话框窗口中,在项目模板搜索框中输入“控制台应用”,然后选择第一个结果。 选择对话框底部的“下一步”。

    显示如何使用 Visual Studio 创建新项目的屏幕截图。

  3. 对于“项目名称”,请输入“BlobQuickstart”。 保留其余字段的默认值,然后选择“下一步”。

  4. 对于 Framework,请确保已选择最新安装版本的 .NET。 然后选择“创建”。 此时新项目在 Visual Studio 环境中打开。

安装包

若要与 Azure Blob 存储交互,请安装适用于 .NET 的 Azure Blob 存储客户端库。

  1. 解决方案资源管理器中,右键单击项目的“依赖项”节点。 选择“管理 NuGet 包”。

  2. 在出现的窗口中,搜索 Azure.Storage.Blobs。 选择相应的结果,然后选择“安装”。

    显示如何使用 Visual Studio 添加新包的屏幕截图。

设置应用代码

替换 Program.cs 文件中的起始代码,使其与以下示例匹配,其中包括本练习所需的 using 语句。

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using System;
using System.IO;

// See https://aka.ms/new-console-template for more information
Console.WriteLine("Hello, World!");

对象模型

Azure Blob 存储最适合存储巨量的非结构化数据。 非结构化数据并不遵循特定数据模型或定义(如文本或二进制数据)。 Blob 存储提供了三种类型的资源:

  • 存储帐户
  • 存储帐户中的容器
  • 容器中的 blob

以下图示显示了这些资源之间的关系。

Blob 存储体系结构的图示。

使用以下 .NET 类与这些资源进行交互:

  • BlobServiceClientBlobServiceClient 类可用于操纵 Azure 存储资源和 blob 容器。
  • BlobContainerClientBlobContainerClient 类可用于操纵 Azure 存储容器及其 blob。
  • BlobClientBlobClient 类可用于操纵 Azure 存储 blob。

代码示例

以下部分中的示例代码片段演示如何使用适用于 .NET 的 Azure Blob 存储客户端库执行以下任务:

重要

设置部分所述,请确保已安装正确的 NuGet 包并添加了必要的 using 语句以使代码示例能够正常工作。

向 Azure 进行身份验证并授权访问 Blob 数据

对 Azure Blob 存储的应用程序请求必须获得授权。 要在代码中实现与 Azure 服务(包括 Blob 存储)的无密码连接,推荐使用 azure-identity 客户端库提供的 DefaultAzureCredential 类。

你还可以使用帐户访问密钥授权对 Azure Blob 存储的请求。 但是,应谨慎使用此方法。 开发人员必须尽量避免在不安全的位置公开访问密钥。 具有访问密钥的任何人都可以授权针对存储帐户的请求,并且实际上有权访问所有数据。 DefaultAzureCredential 提供比帐户密钥更好的管理和安全优势,来实现无密码身份验证。 以下示例演示了这两个选项。

连接字符串包括存储帐户访问密钥,并使用它来授权请求。 请始终小心,不要在不安全的位置公开密钥。

备注

若要使用存储帐户访问密钥授权数据访问,需要以下 Azure RBAC 操作的权限:Microsoft.Storage/storageAccounts/listkeys/action。 具有此操作权限的最小特权内置角色是读取者和数据访问,但包含此操作的任何角色都将起作用。

  1. 登录 Azure 门户

  2. 找到自己的存储帐户。

  3. 在存储帐户菜单窗格中的“安全性 + 网络”下,选择“访问密钥”。 在这里,可以查看帐户访问密钥以及每个密钥的完整连接字符串。

  4. 在“访问密钥”窗格中,选择“显示密钥”。

  5. 在“key1”部分,找到“连接字符串”值。 选择“复制到剪贴板”图标来复制该连接字符串。 在下一部分,你要将此连接字符串值添加到某个环境变量。

    显示如何从 Azure 门户复制连接字符串的屏幕截图。

配置存储连接字符串

在复制连接字符串后,请将其写入到运行该应用程序的本地计算机上的新环境变量。 若要设置环境变量,请打开控制台窗口,并遵照适用于操作系统的说明。 将 <yourconnectionstring> 替换为实际的连接字符串。

Windows

setx AZURE_STORAGE_CONNECTION_STRING "<yourconnectionstring>"

在 Windows 中添加环境变量后,必须启动命令窗口的新实例。 如果在 Windows 上使用 Visual Studio,可能需要在创建环境变量后重新启动 Visual Studio 才能检测到更改。

Linux:

export AZURE_STORAGE_CONNECTION_STRING="<yourconnectionstring>"

下面的代码从之前创建的环境变量中检索存储帐户的连接字符串,并使用连接字符串构造服务客户端对象。

Program.cs 文件的末尾添加以下代码:

// Retrieve the connection string for use with the application. 
string connectionString = Environment.GetEnvironmentVariable("AZURE_STORAGE_CONNECTION_STRING");

// Create a BlobServiceClient object 
var blobServiceClient = new BlobServiceClient(connectionString);

重要

应谨慎使用帐户访问密钥。 如果帐户访问密钥丢失或意外放置在不安全的位置,服务可能会变得易受攻击。 具有访问密钥的任何人都可以授权针对存储帐户的请求,并且实际上有权访问所有数据。 DefaultAzureCredential 提供增强的安全功能和优势,是管理 Azure 服务授权的推荐方法。

创建容器

通过在 blobServiceClient 对象上调用 CreateBlobContainerAsync 方法,在存储帐户中创建新容器。 在此示例中,代码将 GUID 值追加到容器名称,以确保它是唯一的。

Program.cs 文件的末尾添加以下代码:

// TODO: Replace <storage-account-name> with your actual storage account name
var blobServiceClient = new BlobServiceClient(
        new Uri("https://<storage-account-name>.blob.core.chinacloudapi.cn"),
        new DefaultAzureCredential());

//Create a unique name for the container
string containerName = "quickstartblobs" + Guid.NewGuid().ToString();

// Create the container and return a container client object
BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName);

若要详细了解如何创建容器并浏览更多代码示例,请参阅使用 .NET 创建 Blob 容器

重要

容器名称必须为小写。 有关命名容器和 Blob 的详细信息,请参阅命名和引用容器、Blob 和元数据

将 Blob 上传到容器中

使用 UploadAsync 将 blob 上传到容器。 示例代码将在本地数据目录中创建文本文件以上传到容器。

Program.cs 文件的末尾添加以下代码:

// Create a local file in the ./data/ directory for uploading and downloading
string localPath = "data";
Directory.CreateDirectory(localPath);
string fileName = "quickstart" + Guid.NewGuid().ToString() + ".txt";
string localFilePath = Path.Combine(localPath, fileName);

// Write text to the file
await File.WriteAllTextAsync(localFilePath, "Hello, World!");

// Get a reference to a blob
BlobClient blobClient = containerClient.GetBlobClient(fileName);

Console.WriteLine("Uploading to Blob storage as blob:\n\t {0}\n", blobClient.Uri);

// Upload data from the local file, overwrite the blob if it already exists
await blobClient.UploadAsync(localFilePath, true);

若要详细了解如何上传 Blob 并浏览更多代码示例,请参阅使用 .NET 上传 Blob

列出容器中的 Blob

通过调用 GetBlobsAsync 方法,列出容器中的 blob。

Program.cs 文件的末尾添加以下代码:

Console.WriteLine("Listing blobs...");

// List all blobs in the container
await foreach (BlobItem blobItem in containerClient.GetBlobsAsync())
{
    Console.WriteLine("\t" + blobItem.Name);
}

若要详细了解如何列出 Blob 并浏览更多代码示例,请参阅使用 .NET 列出 Blob

下载 blob

通过调用 DownloadToAsync 方法下载之前创建的 blob。 示例代码会将字符串“DOWNLOADED”追加到文件名,以便你可以在本地文件系统中看到这两个文件。

Program.cs 文件的末尾添加以下代码:

// Download the blob to a local file
// Append the string "DOWNLOADED" before the .txt extension 
// so you can compare the files in the data directory
string downloadFilePath = localFilePath.Replace(".txt", "DOWNLOADED.txt");

Console.WriteLine("\nDownloading blob to\n\t{0}\n", downloadFilePath);

// Download the blob's contents and save it to a file
await blobClient.DownloadToAsync(downloadFilePath);

若要详细了解如何下载 Blob 并浏览更多代码示例,请参阅使用 .NET 下载 Blob

删除容器

以下代码将使用 DeleteAsync 来删除容器,以清理应用创建的资源。 该代码示例还会删除应用创建的本地文件。

在删除 blob、容器和本地文件之前,应用会调用 Console.ReadLine 以暂停并等待用户输入。 可以通过此机会验证是否已正确创建资源,然后再删除这些资源。

Program.cs 文件的末尾添加以下代码:

// Clean up
Console.Write("Press any key to begin clean up");
Console.ReadLine();

Console.WriteLine("Deleting blob container...");
await containerClient.DeleteAsync();

Console.WriteLine("Deleting the local source and downloaded files...");
File.Delete(localFilePath);
File.Delete(downloadFilePath);

Console.WriteLine("Done");

若要详细了解如何删除容器并浏览更多代码示例,请参阅使用 .NET 删除和还原 Blob 容器

完成的代码

完成这些步骤后,Program.cs 文件中的代码现在应如下所示:

using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;

// TODO: Replace <storage-account-name> with your actual storage account name
var blobServiceClient = new BlobServiceClient("<storage-account-connection-string>");

//Create a unique name for the container
string containerName = "quickstartblobs" + Guid.NewGuid().ToString();

// Create the container and return a container client object
BlobContainerClient containerClient = await blobServiceClient.CreateBlobContainerAsync(containerName);

// Create a local file in the ./data/ directory for uploading and downloading
string localPath = "data";
Directory.CreateDirectory(localPath);
string fileName = "quickstart" + Guid.NewGuid().ToString() + ".txt";
string localFilePath = Path.Combine(localPath, fileName);

// Write text to the file
await File.WriteAllTextAsync(localFilePath, "Hello, World!");

// Get a reference to a blob
BlobClient blobClient = containerClient.GetBlobClient(fileName);

Console.WriteLine("Uploading to Blob storage as blob:\n\t {0}\n", blobClient.Uri);

// Upload data from the local file
await blobClient.UploadAsync(localFilePath, true);

Console.WriteLine("Listing blobs...");

// List all blobs in the container
await foreach (BlobItem blobItem in containerClient.GetBlobsAsync())
{
    Console.WriteLine("\t" + blobItem.Name);
}

// Download the blob to a local file
// Append the string "DOWNLOADED" before the .txt extension 
// so you can compare the files in the data directory
string downloadFilePath = localFilePath.Replace(".txt", "DOWNLOADED.txt");

Console.WriteLine("\nDownloading blob to\n\t{0}\n", downloadFilePath);

// Download the blob's contents and save it to a file
await blobClient.DownloadToAsync(downloadFilePath);

// Clean up
Console.Write("Press any key to begin clean up");
Console.ReadLine();

Console.WriteLine("Deleting blob container...");
await containerClient.DeleteAsync();

Console.WriteLine("Deleting the local source and downloaded files...");
File.Delete(localFilePath);
File.Delete(downloadFilePath);

Console.WriteLine("Done");

运行代码

此应用在本地 data 文件夹中创建测试文件,并将其上传到 Blob 存储。 然后,该示例会列出容器中的 blob,并使用新名称下载文件,这样便可对新旧文件进行对比。

如果使用 Visual Studio,请按 F5 生成并运行代码,并与控制台应用交互。 如果使用的是 .NET CLI,请导航到应用程序目录,然后生成并运行该应用程序。

dotnet build
dotnet run

应用的输出类似于以下示例(为便于阅读,省略了 GUID 值):

Azure Blob Storage - .NET quickstart sample

Uploading to Blob storage as blob:
         https://mystorageacct.blob.core.chinacloudapi.cn/quickstartblobsGUID/quickstartGUID.txt

Listing blobs...
        quickstartGUID.txt

Downloading blob to
        ./data/quickstartGUIDDOWNLOADED.txt

Press any key to begin clean up
Deleting blob container...
Deleting the local source and downloaded files...
Done

在开始清理过程之前,请在“data”文件夹中查看这两个文件。 可打开它们,然后就会看到它们完全相同。

清理资源

验证文件并完成测试后,请按 Enter 键删除测试文件以及在存储帐户中创建的容器。 还可以使用 Azure CLI 来删除资源。

下一步

注意:作者在 AI 的帮助下创作了此文章。 了解详细信息