【发布时间】:2020-12-01 12:26:40
【问题描述】:
我计划使用 cosmos db 延续令牌实现分页。我的 api 将返回结果和继续令牌给客户端。我的问题是哪个是存储延续令牌的最佳位置?此外,每个后续请求都会更改令牌?如何维护之前的 continousTokens?
这里显示了我们从哪里获取值,而不是在哪里存储它How to pass\user azure continue token via webAPI Pagination in Cosmos DB using Page Size and Page Number
controller.cs
[Route("myApps")]
[HttpGet]
public async Task<IActionResult> GetAllAppsAsync(string continuationToken, CancellationToken cancellationToken)
{
var user = this.GetUser();
var results = await this.appRepository.GetAppsForUserAsync(user, continuationToken, cancellationToken).ConfigureAwait(false);
var result = this.mapper.Map<AppHeader[]>(results.Value);
return this.Ok(new KeyValuePair<string, AppDefinitionHeader[]>(results.Key, result));
}
Repository.cs
public async Task<KeyValuePair<string, IEnumerable<App>>> GetAppForUserAsync(User user, string continuationToken, CancellationToken cancellationToken)
{
try
{
FeedOptions queryOptions = new FeedOptions
{
MaxItemCount = 2,
RequestContinuation = continuationToken
};
string token = string.Empty;
var query = this.factory.GetClient()
.CreateDocumentQuery<AppDefinitionResource>(
UriFactory.CreateDocumentCollectionUri(DatabaseName, CollectionName),
queryOptions)
.AsDocumentQuery();
List<AppDefinition> results = new List<AppDefinition>();
while (query.HasMoreResults && results.Count <= 2)
{
cancellationToken.ThrowIfCancellationRequested();
var response = await query.ExecuteNextAsync<App>(cancellationToken).ConfigureAwait(false);
var apps = this.mapper.Map<App[]>(response);
results.AddRange(apps);
token = response.ResponseContinuation;
}
return new KeyValuePair<string, IEnumerable<App>>(token, results);
}
}
更新:
如何维护之前的continousTokens?
Ex : 如果有 100 条记录并且 pageSize=10 并且 pageNumbers 是 1,2,3,4,5,6,7,8,9,10 并且如果用户在任何页面上随机点击。在那种情况下如何获取所需的记录?或者只是如果我在下面的屏幕截图中放置“上一个”按钮并想要在列表中遍历。
【问题讨论】:
-
这取决于您 - 您需要将其返回给 API 的客户端,并公开一种方法,让您的客户端将分页传递回您的 API。
-
嘿,马丁,刚刚更新了问题,正在将 continuationToken 和结果传递给客户端,以及在后续请求中如何绑定从客户端传递的控制器中的 continuationToken?我不能使用 [FromUri] 因为令牌非常大,而且由于 Get 请求我也不能使用 body。这里的最佳做法是什么?
标签: c# .net azure-cosmosdb paging webapi