gpt4 book ai didi

c# - ServiceNow 表 API 返回重复项/不返回所有记录

转载 作者:行者123 更新时间:2023-11-30 23:21:56 25 4
gpt4 key购买 nike

我正在尝试将 所有 数据从 ServiceNow CMDB 数据表中提取到我自己的 SQL 数据库中。当数据在需要与新 SN 实现同步的客户遗留系统中维护时,我计划使用它进行自动更新。

我们的 SN 环境有很多域、很多客户等。这转化为大量数据。由于数据太大,尝试在单个 API 调用中提取所有记录自然会导致超时异常。 Web API建议批处理数据,这是我实现的:

        ...
var offset = 0;

while (true)
{
var requestUrl = string.Format("{0}/api/now/table/cmdb_ci_vm_instance?sysparm_offset={1}&sysparm_limit={2}&sysparm_exclude_reference_link=true", url, offset, batchSize);
var result = ApiRequest.Get(new Uri(requestUrl), _credential, null, out response);
if (result == HttpStatusCode.OK)
{
var virtualmachineRo = JsonConvert.DeserializeObject<VirtualMachineRootObject>(response);

if (virtualmachineRo.result.Count < batchSize)
{
virtualmachines.AddRange(virtualmachineRo.result);
break;
}

virtualmachines.AddRange(virtualmachineRo.result);
offset += virtualmachineRo.result.Count;
}
else
{
break;
}
}
....

我曾处理过不同的批处理大小,它给了我不同的结果。根据我打的是哪个表,有时我会得到重复项,有时我不会,有时我会得到不同的重复项。在几乎所有情况下,当我DO 得到一个副本时,副本会替换流中的有效记录,这意味着我“丢失”了一个有效记录。

我已通过查看来自 serviceNow 的原始数据流并查看重复项,并验证 ServiceNow 中是否存在未显示在我的流中的记录(通常在我尝​​试创建丢失的数据时发现)来确认这一点记录和 SN 响应“忽略 - 没有字段更改”表明记录已经存在。)

我试图搜索并找到任何有类似问题的人,但没有找到任何东西。在直接使用 SN 开票之前,我希望看看我的代码是否有什么地方做错了,或者这是否符合我的预期 - 一个与平台相关的错误。

最佳答案

所以这几乎可以肯定是他们的 API 中与服务帐户访问相关的错误。这是我所做的,以及我认为正在发生的事情(以及我的工作!)

在尝试了一些不同的逻辑之后,我遇到了以下情况:

{0}/api/now/table/cmdb_ci_vm_instance?sysparm_offset=0&sysparm_limit=750&sysparm_exclude_reference_link=true&sysparm_query=ORDERBYsys_id
2016-08-19 12:46:15,277 [INFO ] Returned Records Count: 750

{0}/api/now/table/cmdb_ci_vm_instance?sysparm_offset=750&sysparm_limit=750&sysparm_exclude_reference_link=true&sysparm_query=ORDERBYsys_id
2016-08-19 12:46:28,243 [INFO ] Returned Records Count: 746

注意第二遍我要求750条记录,但只得到746条(相差4.)其他批处理继续正常返回750条,最后我在5200+条中正好有4条重复检索到的记录总数。因为第二遍返回的值少于我要求的 750,所以我的代码被破坏了,因为它认为数据是完整的...

为了解决这个问题(最初)我对上面的代码做了以下操作:

if (virtualmachineRo.result.Count == 0)
{
//AddRange(virtualmachineRo.result);
break;
}

我不再相信仅仅因为返回的记录数少于我检索所有记录的 sysparm_limit。

看起来当从数据库中提取数据时,一个单独的进程会根据您的权限过滤数据。因此,第二批删除了 4 条记录 - 但数据库不知道更好......所以在下一次通过 746 调用返回的实际计数增加我的偏移量时,它返回相同的数据集和最后一次该批处理的4条记录被复制为下一页数据中的前4条记录。 (在数据流中确认 - 排序数据时,它会导致重复出现在不同的地方,并且不同的记录也会根据批处理大小/顺序重复!)

我不敢相信这是有意为之的行为,而且 Wiki 中肯定没有记录。无论哪种方式,解决方法对于遇到此问题的任何人来说都很简单:即使返回的计数小于批大小,您也必须继续提取数据,并继续直到返回 0 条记录。然后你必须用一些简单的东西过滤掉重复项:

yourrecords.GroupBy(x => x.sys_id).Select(x => x.First()).ToList();

问题就“解决了”。

关于c# - ServiceNow 表 API 返回重复项/不返回所有记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39020346/

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