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

是否要将 .NET 应用程序部署到Amazon通过几个简单点击即可? 尝试我们的新.NET CLI 工具为了简化部署体验!阅读我们的博客帖子然后提交反馈GitHub

有关更多信息,请参阅部署工具

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

Paginators

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

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

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

在哪里找到分页器?

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

例如,如果您检查定义AmazonCloudWatchLogsClient课堂,你看Paginators财产。这是为 Amazon CloudWatch Logs 提供分页器的属性。

分页器给我什么?

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

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

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

同步分页与异步分页

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

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

Example

以下示例说明如何使用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); }

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