您可以尝试在主键(sys_id)上添加显式排序,以确保每个批处理查询。您可以通过添加URL参数来完成此操作 sysparm_query=ORDERBYsys_id
sysparm_query=ORDERBYsys_id
您的网址如下所示: "{0}/api/now/table/cmdb_ci_vm_instance?sysparm_offset={1}&sysparm_limit={2}&sysparm_exclude_reference_link=true&sysparm_query=ORDERBYsys_id"
"{0}/api/now/table/cmdb_ci_vm_instance?sysparm_offset={1}&sysparm_limit={2}&sysparm_exclude_reference_link=true&sysparm_query=ORDERBYsys_id"
所以这几乎肯定是他们的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中。无论哪种方式,对于遇到此问题的任何人来说,解决方法都很简单:即使返回的计数小于batchsize,也必须继续提取数据,并继续直到返回0条记录。然后你必须用以下简单的东西过滤掉重复项:
yourrecords.GroupBy(x => x.sys_id).Select(x => x.First()).ToList();
问题是“解决了”。