你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn

快速入门:使用 .NET 创建和分配存储任务

本快速入门介绍如何使用适用于 .NET 的 Azure 存储作客户端库创建存储任务并将其分配给 Azure 存储帐户。 然后,你将查看运行结果。 存储任务对存储帐户中存在的任何Microsoft Word 文档应用基于时间的不可变性策略。

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

先决条件

  • Azure 订阅 - 创建免费帐户

  • 一个 Azure 存储帐户。 请参阅 创建存储帐户。 创建帐户时,请确保启用版本级不可变性支持,并且未启用分层命名空间功能。

  • 在存储帐户或资源组的上下文中已向用户标识分配存储 Blob 数据所有者角色。

  • 向资源组上下文中的用户标识分配的自定义角色,该上下文包含向存储帐户分配任务所需的 RBAC 操作。 请参阅 分配任务所需的权限

  • 已安装 .NET Framework 4.7.2 或更高版本。 有关详细信息,请参阅下载 .NET Framework

设置

本部分将指导你准备项目。

创建项目

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

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

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

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

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

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

安装软件包

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

  2. 在生成的窗口中,选中 “包括预发行版 ”复选框,然后搜索 Azure.ResourceManager.StorageActions。 选择相应的结果,然后选择“安装”

    显示如何使用 Visual Studio 添加 Azure.ResourceManager.StorageActions 包的屏幕截图。

  3. 接下来,搜索 Azure.ResourceManager.Storage。 选择相应的结果,然后选择“安装”

    显示如何使用 Visual Studio 添加 Azure.ResourceManager.Storage 包的屏幕截图。

  4. 搜索 Azure.ResourceManager.Authorization*。 选择相应的结果,然后选择“安装”

    显示如何使用 Visual Studio 添加 Azure.ResourceManager.Authorization 包的屏幕截图。

设置应用代码

替换文件中的起始代码 Program.cs ,使其与以下示例匹配,其中包括本快速入门的必要 using 语句。

using Azure;
using Azure.Core;
using Azure.ResourceManager;
using Azure.ResourceManager.Models;
using Azure.ResourceManager.Resources;
using Azure.ResourceManager.StorageActions;
using Azure.ResourceManager.StorageActions.Models;
using Azure.ResourceManager.Storage.Models;
using Azure.ResourceManager.Storage;
using Azure.ResourceManager.Authorization;
using Azure.ResourceManager.Authorization.Models;

使用 DefaultAzureCredential 登录并将应用代码连接到 Azure

  1. 对于本地开发,请确保使用分配了该角色的同一 Microsoft Entra 帐户进行身份验证。 可以通过常用的开发工具(如 Azure CLI 或 Azure PowerShell)进行身份验证。 可用于进行身份验证的开发工具因语言而异。

    使用以下命令通过 Azure CLI 登录到 Azure:

    az login
    
  2. 若要使用 DefaultAzureCredential,请将 Azure.Identity 包添加到应用程序。

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

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

      显示如何添加标识包的屏幕截图。

  3. 将以下 using 语句添加到 Program.cs* 文件:

    using Azure.Identity;
    
  4. 将以下代码添加到 Program.cs 文件。 在开发期间,当代码在本地工作站上运行时,它将使用已登录的优先工具的开发人员凭据向 Azure 进行身份验证,例如 Azure CLI 或 Visual Studio。

    TokenCredential cred = new DefaultAzureCredential();
    ArmClient client = new ArmClient(cred);
    

创建存储任务

  1. 在订阅中选择要在其中创建存储任务的资源组。 然后,获取该资源组的存储任务集合。

    • <subscription-id> 此示例中的占位符值替换为订阅的 ID。

    • <resource-group> 此示例中的占位符值替换为资源组的名称。

     string subscriptionId = "<subscription-id>";
     string resourceGroupName = "<resource-group>";
    
     ResourceIdentifier resourceGroupResourceId = 
         ResourceGroupResource.CreateResourceIdentifier(subscriptionId, resourceGroupName);
    
     ResourceGroupResource resourceGroupResource = 
         client.GetResourceGroupResource(resourceGroupResourceId);
    
     StorageTaskCollection storageTaskcollection = resourceGroupResource.GetStorageTasks();
    
  2. 使用 JSON 定义 条件子句 。 一个条件包含一个或多个子句的集合。 子句包含属性、值和运算符。 在以下 JSON 中,属性为 Name,值为 .docx,运算符为 endsWith。 此条款仅允许对 Microsoft Word 文档执行操作。

    string clause = "[[endsWith(Name, '.docx')]]"
    

    有关属性和运算符的完整列表,请参阅 存储任务条件

    小窍门

    可以将多个条件添加到同一字符串中,并使用逗号分隔它们。

  3. 通过包含先前定义的子句以及两个操作来定义完整的条件。 此定义中的第一个操作用于设置不可变性策略。 第二个操作是在 Word 文档的元数据中设置 Blob 索引标记。

     StorageTaskIfCondition condition = new(clause, new StorageTaskOperationInfo[]
     {
         new StorageTaskOperationInfo(StorageTaskOperationName.SetBlobImmutabilityPolicy)
         {
             Parameters =
             {
                 ["untilDate"] = "2025-10-20T22:30:40",
                 ["mode"] = "locked"
             },
             OnSuccess = OnSuccessAction.Continue,
             OnFailure = OnFailureAction.Break,
         },        
         new StorageTaskOperationInfo(StorageTaskOperationName.SetBlobTags)
         {
             Parameters =
             {
                 ["tagsetImmutabilityUpdatedBy"] = "StorageTaskQuickstart"
             },
             OnSuccess = OnSuccessAction.Continue,
             OnFailure = OnFailureAction.Break,
         }
    
     });
    
  4. 创建存储任务,然后将其添加到存储任务集合。

     StorageTaskProperties storageTaskProperties = 
         new(true, "My storage task", new StorageTaskAction(condition));
    
     StorageTaskData storageTaskData = new(
         new AzureLocation("westus"), 
         new ManagedServiceIdentity("SystemAssigned"), 
         storageTaskProperties);
    
     var storageTaskResult = (storageTaskcollection.CreateOrUpdate
         (WaitUntil.Completed, "mystoragetask", storageTaskData)).Value;
    
     Console.WriteLine($"Succeeded on id: {storageTaskResult.Data.Id}");
    

创建分配

若要使用存储任务,必须创建 存储任务分配。 分配将保存为存储帐户资源实例的一部分,并在其他设置中定义所要针对的对象子集、任务在这些对象上运行的时间和频率,以及存储执行报告的位置。

  1. 通过创建执行上下文指定前缀筛选器、运行频率、开始时间。 以下示例针对 mycontainer 容器,并计划在当前时间 10 分钟后运行。

    ExecutionTriggerParameters executionTriggerParameters = new()
    {
        StartOn = DateTime.Now.AddMinutes(10).ToUniversalTime()
    };
    
    ExecutionTrigger executionTrigger = 
        new(ExecutionTriggerType.RunOnce, executionTriggerParameters);
    
    StorageTaskAssignmentExecutionContext storageTaskAssignmentExecutionContext = 
        new(executionTrigger)
    {
        Target = new ExecutionTarget
        {
            Prefix = { "mycontainer/" },
            ExcludePrefix = { },
        }
    };
    
  2. 创建存储任务分配,然后将其添加到存储任务分配集合。 以下分配包括你在上一步中创建的执行上下文。 它还指定目标存储帐户,并配置为将执行报告保存到名为 storage-tasks-report的文件夹。

    string accountName = "mystorageaccount";
    
    ResourceIdentifier storageAccountResourceId = 
        StorageAccountResource.CreateResourceIdentifier
        (subscriptionId, resourceGroupName, accountName);
    
    StorageAccountResource storageAccount = 
        client.GetStorageAccountResource(storageAccountResourceId);
    
    StorageTaskAssignmentCollection storageTaskAssignmentcollection = 
        storageAccount.GetStorageTaskAssignments();
    
    StorageTaskAssignmentProperties storageTaskAssignmentProperties = new(
        new ResourceIdentifier(storageTaskResult.Data.Id.ToString()), true, 
        "My Storage task assignment",
        storageTaskAssignmentExecutionContext,
        new("storage-tasks-report"));
    
    // Create and execute the storage task assignment
    storageTaskAssignmentcollection.CreateOrUpdate(
    WaitUntil.Started,
    "myStorageTaskAssignment",
    new StorageTaskAssignmentData(storageTaskAssignmentProperties));
    
  3. 授予存储任务在目标存储帐户上执行操作的权限。 将 Storage Blob Data Owner 的角色分配给存储任务的系统分配托管标识。

    
    var roleDefId = $"/subscriptions/" + subscriptionId + "/providers/Microsoft.Authorization/roleDefinitions/<b7e6dc6d-f1e8-4753-8033-0f276bb0955b>";
    
    var operationContent = new RoleAssignmentCreateOrUpdateContent(
        new ResourceIdentifier(roleDefId),
        storageTaskResult.Data.Identity.PrincipalId ?? throw new InvalidOperationException("PrincipalId is null"))
    {
        PrincipalType = RoleManagementPrincipalType.ServicePrincipal
    };
    
    ResourceIdentifier roleAssignmentResourceId = RoleAssignmentResource.CreateResourceIdentifier(storageAccount.Id, Guid.NewGuid().ToString());
    
    RoleAssignmentResource roleAssignment = client.GetRoleAssignmentResource(roleAssignmentResourceId);
    
    ArmOperation <RoleAssignmentResource> lro = await roleAssignment.UpdateAsync(WaitUntil.Completed, operationContent);
    RoleAssignmentResource result = lro.Value;
    RoleAssignmentData resourceData = result.Data;
    Console.WriteLine($"Succeeded on id: {resourceData.Id}");
    

运行代码

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

dotnet build
dotnet run

查看任务运行的结果

任务完成运行后,获取每个工作分配的运行报告摘要。

    ResourceIdentifier storageTaskResourceId = StorageTaskResource.CreateResourceIdentifier
        (subscriptionId, resourceGroupName, "mystoragetask");
    StorageTaskResource storageTask = client.GetStorageTaskResource(storageTaskResourceId);
    // invoke the operation and iterate over the result
    await foreach (Azure.ResourceManager.StorageActions.Models.StorageTaskReportInstance item in storageTask.GetStorageTasksReportsAsync())
    {
        Console.WriteLine($"Succeeded: {item.Properties.SummaryReportPath}");
    }

SummaryReportPath每个报表摘要的字段包含详细报表的路径。 该报告包含容器、Blob、执行的操作以及状态的逗号分隔列表。

清理资源

删除所有已创建的资产。 删除资产的最简单方法是删除资源组。 删除资源组还会删除该组中包含的所有资源。 在以下示例中,删除资源组会删除存储帐户和资源组本身。

Remove-AzResourceGroup -Name $ResourceGroup 

后续步骤