你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本快速入门介绍如何使用适用于 .NET 的 Azure 存储作客户端库创建存储任务并将其分配给 Azure 存储帐户。 然后,你将查看运行结果。 存储任务对存储帐户中存在的任何Microsoft Word 文档应用基于时间的不可变性策略。
API 参考文档 | 库源代码 | 包 (NuGet) | 示例
先决条件
Azure 订阅 - 创建免费帐户
一个 Azure 存储帐户。 请参阅 创建存储帐户。 创建帐户时,请确保启用版本级不可变性支持,并且未启用分层命名空间功能。
在存储帐户或资源组的上下文中已向用户标识分配存储 Blob 数据所有者角色。
向资源组上下文中的用户标识分配的自定义角色,该上下文包含向存储帐户分配任务所需的 RBAC 操作。 请参阅 分配任务所需的权限。
已安装 .NET Framework 4.7.2 或更高版本。 有关详细信息,请参阅下载 .NET Framework。
设置
本部分将指导你准备项目。
创建项目
使用 .NET CLI 或 Visual Studio 2022 创建 .NET 控制台应用。
在 Visual Studio 顶部,导航到“文件”“新建”>“项目”>。
在对话框窗口中,在项目模板搜索框中输入“控制台应用”,然后选择第一个结果。 选择对话框底部的“下一步”。
对于 项目名称,请输入 StorageTaskQuickstart。 保留其余字段的默认值,然后选择“下一步”。
对于 Framework,请确保已选择最新安装版本的 .NET。 然后选择" 创建"。 新项目在 Visual Studio 环境中打开。
安装软件包
在解决方案资源管理器中,右键单击项目的“依赖项”节点。 选择“管理 NuGet 包”。
在生成的窗口中,选中 “包括预发行版 ”复选框,然后搜索 Azure.ResourceManager.StorageActions。 选择相应的结果,然后选择“安装”。
接下来,搜索 Azure.ResourceManager.Storage。 选择相应的结果,然后选择“安装”。
搜索 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
-
对于本地开发,请确保使用分配了该角色的同一 Microsoft Entra 帐户进行身份验证。 可以通过常用的开发工具(如 Azure CLI 或 Azure PowerShell)进行身份验证。 可用于进行身份验证的开发工具因语言而异。
使用以下命令通过 Azure CLI 登录到 Azure:
az login
-
若要使用
DefaultAzureCredential
,请将 Azure.Identity 包添加到应用程序。在解决方案资源管理器中,右键单击项目的“依赖项”节点。 选择“管理 NuGet 包”。
在出现的窗口中,搜索 Azure.Identity。 选择相应的结果,然后选择“安装”。
将以下 using 语句添加到 Program.cs* 文件:
using Azure.Identity;
将以下代码添加到 Program.cs 文件。 在开发期间,当代码在本地工作站上运行时,它将使用已登录的优先工具的开发人员凭据向 Azure 进行身份验证,例如 Azure CLI 或 Visual Studio。
TokenCredential cred = new DefaultAzureCredential(); ArmClient client = new ArmClient(cred);
创建存储任务
在订阅中选择要在其中创建存储任务的资源组。 然后,获取该资源组的存储任务集合。
将
<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();
使用 JSON 定义 条件子句 。 一个条件包含一个或多个子句的集合。 子句包含属性、值和运算符。 在以下 JSON 中,属性为
Name
,值为.docx
,运算符为endsWith
。 此条款仅允许对 Microsoft Word 文档执行操作。string clause = "[[endsWith(Name, '.docx')]]"
有关属性和运算符的完整列表,请参阅 存储任务条件。
小窍门
可以将多个条件添加到同一字符串中,并使用逗号分隔它们。
通过包含先前定义的子句以及两个操作来定义完整的条件。 此定义中的第一个操作用于设置不可变性策略。 第二个操作是在 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, } });
创建存储任务,然后将其添加到存储任务集合。
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}");
创建分配
若要使用存储任务,必须创建 存储任务分配。 分配将保存为存储帐户资源实例的一部分,并在其他设置中定义所要针对的对象子集、任务在这些对象上运行的时间和频率,以及存储执行报告的位置。
通过创建执行上下文指定前缀筛选器、运行频率、开始时间。 以下示例针对
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 = { }, } };
创建存储任务分配,然后将其添加到存储任务分配集合。 以下分配包括你在上一步中创建的执行上下文。 它还指定目标存储帐户,并配置为将执行报告保存到名为
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));
授予存储任务在目标存储帐户上执行操作的权限。 将
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