我试图将所有数据从ServiceNow CMDB数据表中抽取到我自己的SQL数据库中。我计划在数据在需要与新SN实现同步的客户遗留系统中进行维护时将其用于自动更新。ServiceNow Table API返回重复/不返回所有记录
我们的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的票之前,我希望看看是否有一些错误的代码,或者我认为这是一个与平台相关的bug。
这听起来像一个很好的解决方法 - 我现在要试一试。会回到你身边。 (这也符合我的假设 - 他们没有在批量购买前在SN端订购数据。) –
不幸的是,这并没有奏效 - 更奇怪的是,如果我不批量并试图拖动整个数据集(这太大),它会超时......但会返回一个包含2000-4000条记录的部分数据集。每次都不一样。我希望HTTP代码是408或类似的东西,但是我得到一个部分数据集,其中嵌入了一个错误,但仍然是一个HTTP 200.非常令人沮丧= / –