Azure Cosmos 分页:FeedResponse.ContinuationToken 在下一个请求中不起作用
Azure Cosmos Pagination: FeedResponse.ContinuationToken not working in the next request
下面是我在 Azure Cosmos 中进行分页的代码。在该函数中,我 return FeedResponse 的 ContinuationToken。获取第一页的第一个请求很好,它 return Continuation Token。但是,如果我在下一个请求中使用该令牌,则 API return 错误 500.
我还注意到来自 FeedRespone 的 ContinuationToken return 看起来像这样的 Json 格式。我试图只获取令牌部分,甚至复制整个 json 但没有雪茄
"nextToken": "[{"token":"+RID:~UVURALkfIb4FAAAAAAAAAA==#RT:1#TRC:3#RTD:hCgamV5sp6dv/pVR3z0oBTMxMzIuMTQuNDFVMTY7MjY7NDIvOTk3MzIxMlsA#ISV:2#IEO:65567#QCF:1#FPC:AQEAAAAAAAAACAAAAAAAAAA=","range":{"min":"","max":"FF"}}]"
第一页的响应带有令牌return
输入Return令牌到下一个请求和错误500
函数代码
public virtual async Task<(IEnumerable<TDomain>, string token)> ListAsync(List<ISpecification<TEntity>> specifications, PageOptions pageOptions, CancellationToken cancellationToken)
{
var container = await GetContainer(cancellationToken);
string token = null;
var result = new List<TDomain>();
QueryRequestOptions options = new QueryRequestOptions()
{
MaxItemCount = pageOptions.MaxResults
};
options.MaxItemCount = pageOptions.MaxResults;
try
{
var query = container
.GetItemLinqQueryable<TEntity>(false, pageOptions.NextToken, options)
.Specify(specifications);
var iterator = _cosmosLinqQuery.GetFeedIterator(query);
var response = await iterator.ReadNextAsync(cancellationToken);
token = response.ContinuationToken; // return a token
foreach (var item in response)
{
var mapped = _mapper.ToDomain(item);
result.Add(mapped);
}
}
catch (Exception ex)
{
var exception = new DataAccessException("Unexpected error while listing items", ex);
exception.Data["ContainerName"] = ContainerName;
throw exception;
}
return (result,token);
}
您的第二个屏幕截图显示您正在传递以 +RID...
开头的令牌,这不是之前令牌的开头方式(之前的令牌以 [{"token"
开头)。
您能否删除作为令牌一部分的 JSON 包装属性?
第二个调用应该 正好 [{"token":"+RID:~UVURALkfIb4FAAAAAAAAAA==#RT:1#TRC:3#RTD:hCgamV5sp6dv/pVR3z0oBTMxMzIuMTQuNDFVMTY7MjY7NDIvOTk3MzIxMlsA#ISV:2#IEO:65567#QCF:1#FPC:AQEAAAAAAAAACAAAAAAAAAA=","range":{"min":"","max":"FF"}}]
。
请记住,您也在 URL 中发送它,因此那里也可能有字符转义。
下面是我在 Azure Cosmos 中进行分页的代码。在该函数中,我 return FeedResponse 的 ContinuationToken。获取第一页的第一个请求很好,它 return Continuation Token。但是,如果我在下一个请求中使用该令牌,则 API return 错误 500.
我还注意到来自 FeedRespone 的 ContinuationToken return 看起来像这样的 Json 格式。我试图只获取令牌部分,甚至复制整个 json 但没有雪茄
"nextToken": "[{"token":"+RID:~UVURALkfIb4FAAAAAAAAAA==#RT:1#TRC:3#RTD:hCgamV5sp6dv/pVR3z0oBTMxMzIuMTQuNDFVMTY7MjY7NDIvOTk3MzIxMlsA#ISV:2#IEO:65567#QCF:1#FPC:AQEAAAAAAAAACAAAAAAAAAA=","range":{"min":"","max":"FF"}}]"
第一页的响应带有令牌return
函数代码
public virtual async Task<(IEnumerable<TDomain>, string token)> ListAsync(List<ISpecification<TEntity>> specifications, PageOptions pageOptions, CancellationToken cancellationToken)
{
var container = await GetContainer(cancellationToken);
string token = null;
var result = new List<TDomain>();
QueryRequestOptions options = new QueryRequestOptions()
{
MaxItemCount = pageOptions.MaxResults
};
options.MaxItemCount = pageOptions.MaxResults;
try
{
var query = container
.GetItemLinqQueryable<TEntity>(false, pageOptions.NextToken, options)
.Specify(specifications);
var iterator = _cosmosLinqQuery.GetFeedIterator(query);
var response = await iterator.ReadNextAsync(cancellationToken);
token = response.ContinuationToken; // return a token
foreach (var item in response)
{
var mapped = _mapper.ToDomain(item);
result.Add(mapped);
}
}
catch (Exception ex)
{
var exception = new DataAccessException("Unexpected error while listing items", ex);
exception.Data["ContainerName"] = ContainerName;
throw exception;
}
return (result,token);
}
您的第二个屏幕截图显示您正在传递以 +RID...
开头的令牌,这不是之前令牌的开头方式(之前的令牌以 [{"token"
开头)。
您能否删除作为令牌一部分的 JSON 包装属性?
第二个调用应该 正好 [{"token":"+RID:~UVURALkfIb4FAAAAAAAAAA==#RT:1#TRC:3#RTD:hCgamV5sp6dv/pVR3z0oBTMxMzIuMTQuNDFVMTY7MjY7NDIvOTk3MzIxMlsA#ISV:2#IEO:65567#QCF:1#FPC:AQEAAAAAAAAACAAAAAAAAAA=","range":{"min":"","max":"FF"}}]
。
请记住,您也在 URL 中发送它,因此那里也可能有字符转义。