gpt4 book ai didi

c# - Azure Cosmos C# SDK v3 返回无效的继续 token

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

我正在将应用程序从 Cosmos C# SDK v2 迁移到 v3。我在分页时遇到了障碍,似乎无法弄清楚。
我有一个请求,它将搜索特定的容器并通过请求进行分页。我的代码设置为处理页面大小 (maxItemCount) 和继续 token 。此外,前几个请求效果很好。但是当我喜欢第四页时,我在 Cosmos 的响应中得到的继续 token 无效。它看起来像这样:[{\"range\":{\"min\":\"05C1DFFFFFFFFC\",\"max\":\"FF\"}}]而且,当我将其传递给下一个请求以获取以下页面时,我收到以下错误:Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (Response status code does not indicate success: BadRequest (400); Substatus: 0; ActivityId: ; Reason: (CompositeContinuationToken is missing field: 'token': {"range":{"min":"05C1DFFFFFFFFC","max":"FF"}}););););););););现在,我发现如果我在发送之前修改延续 token ,我可以让请求成功。这需要我在 JSON 字符串中添加一个属性,你猜对了,token .
这是处理此请求的相关代码:

            IQueryable<LeadEntity> query;
var queryResults = new List<LeadEntity>();

var requestOptions = new QueryRequestOptions
{
MaxItemCount = input.Page?.Size ?? Core.Shared.Constants.PageSize.Default
};

if (input.Page?.ContinuationToken == "" || input.Page?.ContinuationToken == null)
{
query = Container.GetItemLinqQueryable<LeadEntity>(false, null, requestOptions);
}
else
{
query = Container.GetItemLinqQueryable<LeadEntity>(false, input.Page.ContinuationToken, requestOptions);
}

if (input.Criteria?.CallKeys.IsActive ?? false)
{
var callKeys = (input.Criteria.CallKeys?.Value ?? Enumerable.Empty<Guid>())
.Select(a => a.ToString());

query = query.Where(entity => callKeys.Contains(entity.CallKey));
}

if (input.Criteria?.AdvisorOids.IsActive ?? false)
{
var advisorOids = (input.Criteria.AdvisorOids?.Value ?? Enumerable.Empty<Guid>())
.Select(a => a.ToString());

query = query.Where(entity => advisorOids.Contains(entity.AdvisorOid));
}

if (input.Criteria?.CreatedOn.IsActive ?? false)
{
var start = input.Criteria.CreatedOn.Value.Start;
var duration = input.Criteria.CreatedOn.Value.Duration;
var end = input.Criteria.CreatedOn.Value.End;

if (start.HasValue && end.HasValue)
{
query = query.Where(entity => start.Value <= entity.Created.On && entity.Created.On <= end.Value);
}
else if (start.HasValue)
{
query = query.Where(entity => start.Value <= entity.Created.On && entity.Created.On <= start.Value.Add(+duration));
}
else if (end.HasValue)
{
query = query.Where(entity => end.Value >= entity.Created.On && entity.Created.On >= end.Value.Add(-duration));
}
else
{
query = query.Where(entity => false);
}
}

if (input.Criteria?.HasPortalKey.IsActive ?? false)
{
query = query.Where(entity => input.Criteria.HasPortalKey.Value
&& entity.PortalKey != null
&& entity.PortalKey != default(Guid).ToString()
);
}

query = query.Where(a => a.IsRemoved.IsDefined() ? !a.IsRemoved : true);

var totalCount = await query.CountAsync(ct);

query = input.Orderings?.Any() ?? false
? query.OrderBy(string.Join(",", input.Orderings))
: query;

query = input.Limit.HasValue
? query.Take(input.Limit.Value)
: query;

var feedIterator = query.ToFeedIterator();

FeedResponse<LeadEntity> feedResults = await feedIterator.ReadNextAsync(ct);

queryResults.AddRange(feedResults);

Console.WriteLine($"[LeadSearchAsync] total operation cost: {feedResults.RequestCharge} RUs");

var output = new PageOutput<LeadOutput>
{
Items = Mapper.Map<IEnumerable<LeadOutput>>(queryResults),
ContinuationToken = feedResults.ContinuationToken,
TotalCount = totalCount
};

return output;
我一直在谷歌上搜索我的屁股,只发现了几个发生这种情况的实例,它通常在 v2 sdk 上,而不是 v3。我的一部分想认为我在做分页错误,但它似乎在大多数情况下都有效。
任何帮助解决这个问题将不胜感激。我还没有在 v3 SDK 上找到很多关于分页的文档,它与 v2 明显不同。

最佳答案

好的。经过今天更多的谷歌搜索,我发现了这个 Github issue .
基本上我在我的启动中有这个代码块,它设置了默认的 JSONSerializerSettings 来忽略空值:

var JsonSerializerSettings = new JsonSerializerSettings 
{
DateTimeZoneHandling = DateTimeZoneHandling.RoundtripKind,
DateParseHandling = DateParseHandling.DateTimeOffset,
NullValueHandling = NullValueHandling.Ignore,
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};

JsonSerializerSettings.Converters.Add(new StringEnumConverter());
JsonConvert.DefaultSettings = () => JsonSerializerSettings;
这导致我的继续 token 字符串删除了字段 token因为它是空的。显然,在您的延续 token 中有一个空 token 字段是完全正常的。
如果我对上述假设不正确,请告诉我。因为在分页中途我得到一个如下所示的标记:
[{\"token\":null,\"range\":{\"min\":\"05C1DFFFFFFFFC\",\"max\":\"FF\"}}]
无论如何,我将其标记为自我解决。希望它可以帮助其他有同样问题的人。

关于c# - Azure Cosmos C# SDK v3 返回无效的继续 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63023806/

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