Ich versuche, ALLE Daten aus den ServiceNow CMDB-Datentabellen in meine eigene SQL-Datenbank zu ziehen. Ich plane, dies für automatisierte Aktualisierungen zu verwenden, wenn Daten in einem Kunden-Altsystem gepflegt werden, das mit der neuen SN-Implementierung synchronisiert werden muss.ServiceNow-Tabellen-API, die Duplikate zurückgibt/nicht alle Datensätze zurückgibt
Unsere SN-Umgebung hat viele Domänen, viele Kunden usw. Das bedeutet eine riesige Menge an Daten. Wenn versucht wird, ALLE Datensätze in einem einzelnen API-Aufruf abzurufen, führt dies natürlich zu einer Zeitüberschreitungsausnahme, da die Daten zu groß sind. Die Web-API schlägt Daten Dosierung, das ist, was ich umgesetzt haben:
...
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 mit unterschiedlichen Chargengrößen gearbeitet haben, und es gibt mir unterschiedliche Ergebnisse. Abhängig davon, welche Tabelle ich treffe, bekomme ich manchmal Duplikate, manchmal nicht, manchmal bekomme ich andere Duplikate. In fast allen Fällen, wenn ich DO ein Duplikat bekomme, ersetzt das Duplikat einen gültigen Datensatz im Stream, was bedeutet, dass ich einen gültigen Datensatz "vermisse".
Ich habe dies bestätigt, indem ich den rohen Datenstrom von serviceNow betrachte und die Duplikate sehe und überprüfe, dass es Datensätze in ServiceNow gibt, die nicht in meinem Stream angezeigt werden (was normalerweise beim Versuch entdeckt wird, einen fehlender Datensatz und SN antwortet mit "ignored - no field changed" zeigt an, dass der Datensatz bereits vorhanden ist.)
Ich habe versucht, jemanden mit ähnlichen Problemen zu suchen und zu finden, aber nichts gefunden. Bevor ich ein Ticket mit SN direkt geöffnet habe, habe ich gehofft zu sehen, ob ich irgendetwas falsch mit meinem Code gemacht habe, oder ob es das zu sein scheint, was ich erwarte - ein plattformbezogener Bug.
Das klingt nach einer guten Arbeit - ich werde es jetzt versuchen. Wird zu dir zurückkommen. (Dies stimmt auch mit meiner Annahme überein - dass sie die Daten auf der SN-Seite nicht anordneten, bevor sie in der Charge zerschnitten wurden.) –
Leider hat das nicht funktioniert - was noch seltsamer ist, wenn ich es nicht tue Batch und versuchen, den gesamten Datensatz zu ziehen (was viel zu groß ist), es Timeout ... aber gibt einen Teil Datensatz von 2000 bis 4000 Datensätze. Jedes Mal anders. Ich würde einen HTTP-Code von 408 oder etwas Ähnliches erwarten, aber stattdessen erhalte ich einen Teildatensatz mit einem Fehler, der in den Antwortstream eingebettet ist, aber immer noch ein HTTP 200. Sehr frustrierend = / –