使用 .NET 删除和还原 Blob

本文介绍如何使用适用于 .NET 的 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 或还原软删除 Blob 所需的权限。 若要使用 Microsoft Entra ID 进行授权(建议),需有 Azure RBAC 内置角色“存储 Blob 数据参与者”或更高级别的角色。 要了解详细信息,请参阅删除 Blob (REST API)取消删除 Blob (REST API) 的授权指导。

删除 Blob

注意

为存储帐户启用 Blob 软删除后,无法使用客户端库方法执行永久删除。 如果使用本文中所述的方法,软删除的 Blob、Blob 版本或快照在保留期结束之前会一直保持可用,保留期结束后将被永久删除。 若要详细了解基础 REST API 操作,请参阅删除 Blob (REST API)

若要删除 Blob,请调用以下任一方法:

下面的示例删除 Blob:

public static async Task DeleteBlobAsync(BlobClient blob)
{
    await blob.DeleteAsync();
}

如果 Blob 具有任何关联的快照,则必须删除其所有快照才能删除该 Blob。 以下示例删除一个 Blob 及其快照:

public static async Task DeleteBlobSnapshotsAsync(BlobClient blob)
{
    // Delete a blob and all of its snapshots
    await blob.DeleteAsync(snapshotsOption: DeleteSnapshotsOption.IncludeSnapshots);

    // Delete only the blob's snapshots
    //await blob.DeleteAsync(snapshotsOption: DeleteSnapshotsOption.OnlySnapshots);
}

若要删除快照,而不删除 Blob 本身,可以传递参数 DeleteSnapshotsOption.OnlySnapshots

还原已删除的 Blob

Blob 软删除会在系统中将已删除的数据保留指定的一段时间,可以在意外删除或覆盖单个 Blob 及其版本、快照和元数据时提供保护。 在保留期内,可以将 Blob 还原到它在删除时的状态。 在指定的保留期已过后,Blob 将永久被删除。 有关 Blob 软删除的详细信息,请参阅 Blob 的软删除

可以使用 Azure 存储客户端库来还原软删除的 Blob 或快照。

还原软删除的 Blob 的方式取决于存储帐户是否启用了 Blob 版本控制。 有关 Blob 版本控制的详细信息,请参阅 Blob 版本控制。 请根据你的情况,查看以下部分之一:

禁用版本控制时还原软删除的对象

若要在未启用版本控制时还原删除的 Blob,请调用以下任一方法:

这些方法可还原软删除的 blob 以及与之关联的所有已删除快照。 对尚未删除的 Blob 调用以下任一方法均不起作用。 以下示例在容器中还原所有软删除的 Blob 及其快照:

public static async Task RestoreBlobsAsync(BlobContainerClient container)
{
    foreach (BlobItem blob in container.GetBlobs(BlobTraits.None, BlobStates.Deleted))
    {
        await container.GetBlockBlobClient(blob.Name).UndeleteAsync();
    }
}

若要还原特定的软删除快照,请先对基础 Blob 调用 UndeleteUndeleteAsync,然后将所需快照复制到基础 Blob。 以下示例将块 Blob 还原到其最近生成的快照:

public static async Task RestoreSnapshotsAsync(
    BlobContainerClient container,
    BlobClient blob)
{
    // Restore the deleted blob
    await blob.UndeleteAsync();

    // List blobs in this container that match prefix
    // Include snapshots in listing
    Pageable<BlobItem> blobItems = container.GetBlobs(
        BlobTraits.None,
        BlobStates.Snapshots,
        prefix: blob.Name);

    // Get the URI for the most recent snapshot
    BlobUriBuilder blobSnapshotUri = new BlobUriBuilder(blob.Uri)
    {
        Snapshot = blobItems
            .OrderByDescending(snapshot => snapshot.Snapshot)
            .ElementAtOrDefault(0)?.Snapshot
    };

    // Restore the most recent snapshot by copying it to the blob
    await blob.StartCopyFromUriAsync(blobSnapshotUri.ToUri());
}

启用版本控制时还原软删除的 Blob

如果将存储帐户配置为启用 blob 版本控制,则删除 blob 会导致 blob 的当前版本成为以前的版本。 若要在启用了版本控制的情况下还原软删除的 Blob,请将前一个版本复制到基础 Blob。 可以使用以下方法之一:

下面的代码示例演示如何获取已删除 blob 的最新版本,并通过将其复制到基本 blob 来还原最新版本:

public static void RestoreBlobWithVersioning(
    BlobContainerClient container,
    BlobClient blob)
{
    // List blobs in this container that match prefix
    // Include versions in listing
    Pageable<BlobItem> blobItems = container.GetBlobs(
        BlobTraits.None,
        BlobStates.Version,
        prefix: blob.Name);

    // Get the URI for the most recent version
    BlobUriBuilder blobVersionUri = new BlobUriBuilder(blob.Uri)
    {
        VersionId = blobItems.
            OrderByDescending(version => version.VersionId).
            ElementAtOrDefault(0)?.VersionId
    };

    // Restore the most recently generated version by copying it to the base blob
    blob.StartCopyFromUri(blobVersionUri.ToUri());
}

资源

若要详细了解如何使用适用于 .NET 的 Azure Blob 存储客户端库来删除 Blob 和还原已删除的 Blob,请参阅以下资源。

代码示例

REST API 操作

Azure SDK for .NET 包含基于 Azure REST API 而生成的库,允许你通过熟悉的 .NET 范例与 REST API 操作进行交互。 用于删除 Blob 和还原已删除 Blob 的客户端库方法使用以下 REST API 操作:

客户端库资源

请参阅

  • 本文是适用于 .NET 的 Blob 存储开发人员指南的一部分。 若要了解详细信息,请参阅生成 .NET 应用中的开发人员指南文章的完整列表。