gpt4 book ai didi

c# - 在哪里存储以及如何在客户端维护来自 Cosmos db 的延续 token

转载 作者:行者123 更新时间:2023-12-04 08:29:34 25 4
gpt4 key购买 nike

我计划使用 cosmos db continuation token 实现分页。我的 api 将返回结果和继续 token 给客户端。我的问题是哪个是存储延续 token 的最佳位置?此外,每个后续请求都会更改 token ?如何维护之前的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?
例如:如果有 100 条记录并且 pageSize=10 并且 pageNumbers 是 1,2,3,4,5,6,7,8,9,10 并且如果用户在任何页面上随机点击。在这种情况下如何获取所需的记录?或者只是如果我在下面的屏幕截图中放置“上一个”按钮并想在列表中返回。
/image/BMwI2.gif

最佳答案

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

根据评论更新
由于 token 可能很大,因此必须在请求正文中传递它,这也意味着它不应该是 GET 请求。
另一种解决方案是将 token 存储在后端(具有一些有限的 TTL)的较小 key (例如 GUID)的缓存中,然后在后端和客户端之间传递 key 。这样您就可以在 URL 或 URL 查询中传递 key 。但这需要后端保持状态。

关于c# - 在哪里存储以及如何在客户端维护来自 Cosmos db 的延续 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65090478/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com