使用 .NET 创建和管理 Blob 快照
快照是在某一时间点拍摄的只读版本的 Blob。 本文介绍如何使用适用于 .NET 的 Azure 存储客户端库创建和管理 blob 快照。
有关 Azure 存储中 blob 快照的详细信息,请参阅 Blob 快照。
先决条件
设置你的环境
如果没有现有项目,请查看本部分,其中介绍如何设置项目来使用适用于 .NET 的 Azure Blob 存储客户端库。 步骤包括安装包、添加 using
指令,以及创建已授权的客户端对象。 有关详细信息,请参阅 Azure Blob 存储和 .NET 入门。
安装包
从项目目录中,使用 dotnet add package
命令安装 Azure Blob 存储和 Azure 标识客户端库的包。 与 Azure 服务的无密码连接需要 Azure.Identity 包。
dotnet add package Azure.Storage.Blobs
dotnet add package Azure.Identity
添加 using
指令
将这些 using
指令添加到代码文件的顶部:
using Azure.Identity;
using Azure.Storage.Blobs;
using Azure.Storage.Blobs.Models;
using Azure.Storage.Blobs.Specialized;
本文中的某些代码示例可能需要其他 using
指令。
创建客户端对象
若要将应用连接到 Blob 存储,请创建 BlobServiceClient 的实例。 以下示例演示如何使用 DefaultAzureCredential
创建客户端对象进行授权:
public BlobServiceClient GetBlobServiceClient(string accountName)
{
BlobServiceClient client = new(
new Uri($"https://{accountName}.blob.core.chinacloudapi.cn"),
new DefaultAzureCredential());
return client;
}
可以在 .NET 应用中为依赖项注入注册服务客户端。
还可以为特定容器或 Blob 创建客户端对象。 要详细了解如何创建和管理客户端对象,请参阅 创建和管理与数据资源交互的客户端对象。
授权
授权机制必须具有使用 blob 快照所需的权限。 若要使用 Microsoft Entra ID 进行授权(建议),需要 Azure RBAC 内置角色“存储 Blob 数据参与者”或更高级别的角色。 有关详细信息,请参阅快照 Blob 的授权指南。
创建快照
若要创建块 blob 的快照,请使用以下方法之一:
以下代码示例演示如何创建快照。 包含对 Azure.Identity 库的引用,以使用 Microsoft Entra 凭据授权对服务的请求。 若要详细了解如何使用 DefaultAzureCredential 类来授权托管标识访问 Azure 存储,请参阅适用于 .NET 的 Azure 标识客户端库。
private static async Task CreateBlockBlobSnapshot(
string accountName,
string containerName,
string blobName,
Stream data)
{
const string blobServiceEndpointSuffix = ".blob.core.chinacloudapi.cn";
Uri containerUri =
new Uri("https://" + accountName + blobServiceEndpointSuffix + "/" + containerName);
// Get a container client object and create the container.
BlobContainerClient containerClient = new BlobContainerClient(containerUri,
new DefaultAzureCredential());
await containerClient.CreateIfNotExistsAsync();
// Get a blob client object.
BlobClient blobClient = containerClient.GetBlobClient(blobName);
try
{
// Upload text to create a block blob.
await blobClient.UploadAsync(data);
// Add blob metadata.
IDictionary<string, string> metadata = new Dictionary<string, string>
{
{ "ApproxBlobCreatedDate", DateTime.UtcNow.ToString() },
{ "FileType", "text" }
};
await blobClient.SetMetadataAsync(metadata);
// Sleep 5 seconds.
System.Threading.Thread.Sleep(5000);
// Create a snapshot of the base blob.
// You can specify metadata at the time that the snapshot is created.
// If no metadata is specified, then the blob's metadata is copied to the snapshot.
await blobClient.CreateSnapshotAsync();
}
catch (RequestFailedException e)
{
Console.WriteLine(e.Message);
Console.ReadLine();
throw;
}
}
删除快照
若要删除 blob,必须先删除该 blob 的所有快照。 可以单独删除快照,或指定在删除源 Blob 时删除所有快照。 如果尝试删除仍包含快照的 Blob,会发生错误。
若要删除 blob 及其快照,请使用以下方法之一,并包括 DeleteSnapshotsOption 枚举:
以下代码示例演示如何在 .NET 中删除 blob 及其快照,其中 blobClient
是 BlobClient 类型的对象:
await blobClient.DeleteIfExistsAsync(DeleteSnapshotsOption.IncludeSnapshots, null, default);
在基本 Blob 上复制 Blob 快照
只要基本 Blob 位于联机层(热态或冷态),就可以在基本 Blob 上执行复制操作来提升快照。 系统将会保留快照,但会使用一个可读写的副本来覆盖其目标。
以下代码示例演示了如何在基本 Blob 上复制 Blob 快照:
public static async Task<BlockBlobClient> CopySnapshotOverBaseBlobAsync(
BlockBlobClient client,
string snapshotTimestamp)
{
// Instantiate BlockBlobClient with identical URI and add snapshot timestamp
BlockBlobClient snapshotClient = client.WithSnapshot(snapshotTimestamp);
// Restore the specified snapshot by copying it over the base blob
await client.SyncUploadFromUriAsync(snapshotClient.Uri, overwrite: true);
// Return the client object after the copy operation
return client;
}
资源
若要详细了解如何使用适用于 .NET 的 Azure Blob 存储客户端库来管理 Blob 快照,请参阅以下资源。
有关使用已弃用的 .NET 版本 11.x SDK 的相关代码示例,请参阅使用 .NET 版本 11.x 的代码示例。