分页工具 - Amazon SDK for .NET
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

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

分页工具

一段时间Amazon服务会收集和存储大量数据,您可以使用Amazon SDK for .NET. 如果要检索的数据量对于单个 API 调用而言变得太大,则可以通过使用分页.

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

分页器使您能够避免延续令牌的开销,这可能涉及循环、状态变量、多个 API 调用等。当你使用分页器时,你可以从Amazon通过单行代码提供服务,foreach循环的声明。如果需要多次 API 调用才能检索数据,则分页器将为您处理此问题。

在何处找到分页器?

并非所有服务都提供分页器。确定服务是否为特定 API 提供分页器的一种方法是查看Amazon SDK for .NETAPI 参考.

例如,如果您检查定义的AmazonCloudWatchLogsClient课堂,你看见Paginators财产。这是为亚马逊提供分页器的财产 CloudWatch 日志。

分页器给我什么?

分页器包含使您能够看到完整响应的属性。它们通常还包含一个或多个属性,使您能够访问响应中最有趣的部分,我们将这些属性称为主要成果.

例如,在AmazonCloudWatchLogsClient前面提到的,Paginator对象包含Responses完整的财产描述 LogGroups 响应来自 API 调用的对象。该Responses属性除其他外包含日志组的集合。

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

同步分页与异步分页

分页器提供同步和异步分页机制。同步分页可在 .NET Framework 4.5(或更高版本)项目中使用。.NET Core 项目中可以使用异步分页。

由于推荐使用异步操作和 .NET Core,因此接下来的示例显示了异步分页。中的示例之后显示了有关如何使用同步分页和 .NET Framework 4.5(或更高版本)执行相同任务的信息分页器的其他注意事项.

示例

以下示例说明了如何使用Amazon SDK for .NET以显示日志组列表。相比之下,示例说明了如何使用和不使用分页器执行该操作。在查看后面显示的完整代码之前,请考虑以下代码片段。

获取 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界面。

完整代码

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

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}"); } } } } }

分页器的其他注意事项

  • 分页器不能多次使用

    如果你需要特定的结果Amazonpaginator 位于代码中的多个位置,您不能多次使用分页器对象。相反,每次需要时都创建一个新的分页器。以上示例代码示例中显示了此概念。DisplayLogGroupsWithPaginators方法。

  • 同步分页

    同步分页适用于 .NET Framework 4.5(或更高版本)项目。

    要查看这一点,请创建一个 .NET Framework 4.5(或更高版本)项目并将前面的代码复制到该项目。然后只需删除await两者中的关键字foreach分页器调用,如以下示例所示。

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

    构建并运行项目以查看与异步分页相同的结果。