Paginators - 适用于 .NET 的 AWS 开发工具包
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Paginators

有些 AWS 服务收集和存储大量数据,您可以使用 适用于 .NET 的 AWS 开发工具包. 如果要检索的数据量对于单个API调用来说变得太大,您可以通过使用 分页.

为了使您能够执行分页,SDK中许多服务客户端的请求和响应对象提供 延续令牌 (通常命名为 NextToken)。其中部分服务客户还提供 压凝器.

标记器使您能够避免延续令牌的开销,这可能涉及循环、状态变量、多个API调用等。使用标记时,您可以从 AWS 通过单行代码提供服务, foreach 循环的声明。如果需要多个API调用来检索数据,则标记器会为您处理。

在哪里可以找到标记器?

并非所有服务都提供标记器。确定服务是否为特定API提供标记器的一种方法是查看 适用于 .NET 的 AWS 开发工具包 API Reference.

例如,如果您检查了 AmazonCloudWatchLogs客户端 课程,您将看到 Paginators 属性。这是为 Amazon CloudWatch Logs.

分页器给我什么?

标记包含使您能够查看完整响应的属性。它们通常也包含一个或多个属性,使您能够访问最有趣的回复部分,我们将这些回复称为 关键结果.

例如,在 AmazonCloudWatchLogsClient 前文提到的 Paginator 对象包含 Responses 具有完整 描述日志组响应 API调用的对象。这个 Responses 属性包含日志组的集合等。

标记对象还包含一个名为 LogGroups。此属性只保存响应的日志组部分。有了这个关键结果,您就可以在很多情况下减少和简化您的代码。

同步对异步分页

分页器提供用于分页的同步和异步机制。同步分页在.NETFramework4.5(或更高版本)项目中可用。异步分页在.NETCore项目中可用。

由于建议使用异步操作和.NETCore,接下来的示例显示异步分页。有关如何使用同步分页和.NETFramework4.5(或更新版本)执行相同任务的信息,请参见 标记器的其他注意事项.

Example

以下示例向您展示了如何使用 适用于 .NET 的 AWS 开发工具包 显示日志组列表。相比之下,示例显示了如何在使用和不使用标记器时执行此操作。查看完整代码(稍后显示)之前,请考虑以下片段。

获取CloudWatch日志组,无需标记器

// Loop as many times as needed to get all the log groups var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit}; do { Console.WriteLine($"Getting up to {LogGroupLimit} log groups..."); var response = await cwClient.DescribeLogGroupsAsync(request); foreach(var logGroup in response.LogGroups) { Console.WriteLine($"{logGroup.LogGroupName}"); } request.NextToken = response.NextToken; } while(!string.IsNullOrEmpty(request.NextToken));

使用标记器获取CloudWatch日志组

// No need to loop to get all the log groups--the SDK does it for us behind the scenes var paginatorForLogGroups = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(var logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); }

这两个片段的结果完全相同,所以可以清楚地看到使用标记器的优势。

注意

在尝试创建和运行完整代码之前,请确保 设置您的环境. 还要查看 设置您的项目.

你可能还需要 Microsoft.Bcl.Async接口 NuGet包,因为异步分页器使用 IAsyncEnumerable 接口。

完整代码

本节显示此示例的相关参考和完整代码。

NuGet 程序包:

编程元素:

using System; using System.Threading.Tasks; using Amazon.CloudWatchLogs; using Amazon.CloudWatchLogs.Model; namespace CWGetLogGroups { class Program { // A small limit for demonstration purposes private const int LogGroupLimit = 3; // // Main method static async Task Main(string[] args) { var cwClient = new AmazonCloudWatchLogsClient(); await DisplayLogGroupsWithoutPaginators(cwClient); await DisplayLogGroupsWithPaginators(cwClient); } // // Method to get CloudWatch log groups without paginators private static async Task DisplayLogGroupsWithoutPaginators(IAmazonCloudWatchLogs cwClient) { Console.WriteLine("\nGetting list of CloudWatch log groups without using paginators..."); Console.WriteLine("------------------------------------------------------------------"); // Loop as many times as needed to get all the log groups var request = new DescribeLogGroupsRequest{Limit = LogGroupLimit}; do { Console.WriteLine($"Getting up to {LogGroupLimit} log groups..."); DescribeLogGroupsResponse response = await cwClient.DescribeLogGroupsAsync(request); foreach(LogGroup logGroup in response.LogGroups) { Console.WriteLine($"{logGroup.LogGroupName}"); } request.NextToken = response.NextToken; } while(!string.IsNullOrEmpty(request.NextToken)); } // // Method to get CloudWatch log groups by using paginators private static async Task DisplayLogGroupsWithPaginators(IAmazonCloudWatchLogs cwClient) { Console.WriteLine("\nGetting list of CloudWatch log groups by using paginators..."); Console.WriteLine("-------------------------------------------------------------"); // Access the key results; i.e., the log groups // No need to loop to get all the log groups--the SDK does it for us behind the scenes Console.WriteLine("\nFrom the key results..."); Console.WriteLine("------------------------"); IDescribeLogGroupsPaginator paginatorForLogGroups = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(LogGroup logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); } // Access the full response // Create a new paginator, do NOT reuse the one from above Console.WriteLine("\nFrom the full response..."); Console.WriteLine("--------------------------"); IDescribeLogGroupsPaginator paginatorForResponses = cwClient.Paginators.DescribeLogGroups(new DescribeLogGroupsRequest()); await foreach(DescribeLogGroupsResponse response in paginatorForResponses.Responses) { Console.WriteLine($"Content length: {response.ContentLength}"); Console.WriteLine($"HTTP result: {response.HttpStatusCode}"); Console.WriteLine($"Metadata: {response.ResponseMetadata}"); Console.WriteLine("Log groups:"); foreach(LogGroup logGroup in response.LogGroups) { Console.WriteLine($"\t{logGroup.LogGroupName}"); } } } } }

标记器的其他注意事项

  • 标记器不能多次使用

    如果您需要特定 AWS 标记器位于代码中的多个位置,您不得多次使用标记器对象。而是在每次需要时创建新的标记器。此概念显示在 DisplayLogGroupsWithPaginators 方法。

  • 同步分页

    同步分页可用于.NETFramework4.5(或更高版本)项目。

    要查看此代码,请创建一个.NETFramework4.5(或更高版本)项目,并将前面的代码复制到该代码。然后只需移除 await 关键词 foreach paginator呼叫,如以下示例所示。

    /*await*/ foreach(var logGroup in paginatorForLogGroups.LogGroups) { Console.WriteLine(logGroup.LogGroupName); }

    构建并运行项目,以查看您使用异步分页时看到的相同结果。