ServiceNow Table API返回重复/不返回所有记录

时间:2016-08-18 14:06:37

标签: c# rest api servicenow

我试图将所有数据从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 获得重复时,副本会替换流中的有效记录,这意味着我将丢失&#39;有效记录。

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

我试图搜索并找到有类似问题但没有找到任何内容的人。在直接打开SN票之前,我希望看到我的代码是否有错误,或者这似乎是我所期望的 - 与平台相关的错误。

2 个答案:

答案 0 :(得分:2)

因此,这几乎肯定是他们的API与服务帐户访问相关的错误。这就是我所做的,以及我相信的事情(以及我的工作!)

在玩了一些不同的逻辑之后,我遇到了以下内容:

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

关于第二遍的通知我要求750条记录,但只得到了746条(差异为4条)。其他批次继续正常返回750,最后我在5200+中完成了4个重复检索的总记录数。因为第二次传递返回的次数少于我要求的750次,所以我的代码打破了,因为它认为数据已经完成......

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

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

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

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

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

>

问题是“解决了”。

答案 1 :(得分:0)

您可以尝试在主键(sys_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"