Я пытаюсь вытащить ВСЕ данные из таблиц данных 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;
}
}
....
Я работал с различными размерами пакетными, и это дает мне разные результаты. В зависимости от того, в какой таблице я нажимаю, иногда я получаю дубликаты, иногда я этого не делаю, иногда я получаю разные дубликаты. Почти во всех случаях, когда I DO получить дубликат, дубликат заменяет действительную запись в потоке, что означает, что я «отсутствует» действительная запись.
Я подтвердил это, посмотрев на поток необработанных данных, поступающий из serviceNow и увидев дубликаты, и проверил, что в ServiceNow нет записей, которые не отображались в моем потоке (что обычно обнаруживается, когда я пытаюсь создать отсутствует запись, а SN отвечает «игнорируется - поле не изменено», что указывает на то, что запись уже существует.)
Я попытался найти и найти кого-нибудь с похожими проблемами, но ничего не нашел. Перед тем, как открыть билет с помощью SN прямо, я надеялся увидеть, было ли что-то, что я делал неправильно с моим кодом, или если это похоже на то, что я ожидаю - ошибка, связанная с платформой.
Это похоже на хорошую работу - я собираюсь попробовать это сейчас. Вернусь к вам. (Это также соответствует моему предположению, что они не заказывали данные на стороне SN до измельчения в пакете.) –
К сожалению, это не сработало - что еще более странно, если я не сделаю пакет и attemp, чтобы вытащить весь набор данных (который слишком велик), время истекает ... но возвращает частичный набор данных из 2000-4000 записей. Разные каждый раз. Я бы ожидал HTTP-код 408 или что-то подобное, но вместо этого я получаю частичный набор данных с ошибкой, встроенной в поток ответов, но все же HTTP 200. Очень растеряние = / –