客户端从cosmos db获取的延续Token存放在哪里以及如何维护

问题描述 投票:0回答:1

我计划使用 cosmos db 延续令牌来实现分页。我的 api 将返回结果和继续令牌给客户端。我的问题是哪个是存储延续令牌的最佳位置?另外,令牌会根据每个后续请求而改变吗?如何维持之前的ContinousToken?

这里显示了我们从哪里获取值,而不是存储它如何通过 webAPI 传递\用户 azure continue 令牌 使用页面大小和页码在 Cosmos DB 中分页

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

更新:

如何维护之前的continousToken?

例如:如果有 100 条记录,pageSize=10,pageNumbers 为 1,2,3,4,5,6,7,8,9,10,并且用户随机点击任何页面。那么如何获取所需的记录呢?或者只是如果我在下面的屏幕截图中放置“上一个”按钮并想要遍历回列表中。

https://i.sstatic.net/BMwI2.gif

c# .net pagination azure-cosmosdb webapi
1个回答
3
投票

是的,每个请求的令牌都会更改,以便您可以使用以前的令牌检索以前的页面。

如果将令牌传递给客户端以保持后端无状态,则不应在 URL 或 URL 查询中发送令牌,因为令牌可能会变得非常大。在客户端内,您只需将令牌保留在内存中即可。在大多数情况下,没有必要保留令牌,因为令牌应该是短暂的。它应该是短暂的,因为分页结果反映了每个页面请求之间发生的所有更改。


根据评论更新

由于令牌可能很大,因此必须在请求正文中传递它,这也意味着它不应该是 GET 请求。

另一种解决方案是将令牌存储在后端具有较小密钥(例如 GUID)的缓存中(具有一些有限的 TTL),并仅在后端和客户端之间传递密钥。这样您就可以在 URL 或 URL 查询中传递密钥。但这需要后端保持状态。

© www.soinside.com 2019 - 2024. All rights reserved.