在哪里存储以及如何在客户端维护来自cosmos数据库的延续令牌



am计划使用cosmos数据库延续令牌实现分页。我的api将向客户端返回结果和延续令牌。我的问题是,存储延续令牌的最佳位置是哪个?令牌也会随着每个后续请求而变化?如何维护以前的连续代币?

在这里,它显示了我们从哪里获得值,而不是将其存储在哪里如何通过webAPI传递\user azure continue令牌Cosmos数据库中使用页面大小和页码的分页

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

}

更新:

如何维护以前的连续代币?

例如:如果有100条记录,pageSize=10,pageNumbers为1,2,3,4,5,6,7,8,9,10,并且用户随机点击任何页面。在这种情况下,如何获取所需的记录?或者仅仅如果我放置";上一个";按钮,并希望在列表中遍历回来。

https://i.stack.imgur.com/BMwI2.gif

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

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


根据评论更新

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

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

最新更新