Ich arbeite mit C# und versuche, DirectorySearch zu verwenden, um die Gruppen eines extrem großen Microsoft ActiveDirectory LDAP-Servers abzufragen.
Also werde ich in meiner Anwendung eine paginierte Liste von Gruppen mit Suchfunktion haben. Natürlich möchte ich meinen LDAP-Server nicht belasten, indem er mir jedes Mal, wenn ich auf "Nächste Seite" klicke, das gesamte Ergebnis für diese Abfragen übergibt.
Gibt es eine Möglichkeit, mit DirectorySearch NUR die Ergebnisse einer einzelnen willkürlichen Seite abzurufen, anstatt das gesamte Ergebnisset in einem Methodenaufruf zurückzugeben?
Ähnliche Fragen:
- DirectorySearch.PageSize = 2 funktioniert nicht
- C# Active Directory Services findAll() gibt nur 1000 Einträge zurück
Es gibt viele Fragen wie diese, bei denen jemand nach der Seitenzahl (vom LDAP-Server zum App-Server) fragt und Antworten erhält, die PageSize und SizeLimit beinhalten. Diese Eigenschaften wirken sich jedoch nur auf die Seitenumbrüche zwischen dem C#-Server und dem LDAP-Server aus, und letztendlich sind die einzigen relevanten Methoden, die DirectorySearch hat, FindOne() und FindAll().
Was ich suche, ist im Grunde genommen "FindPaged(pageSize, pageNumber)" (wobei die Seitennummer wirklich wichtig ist. Ich möchte nicht nur die ersten 1000 Ergebnisse, sondern zum Beispiel den 100. Satz von 1000 Ergebnissen. Die App kann nicht darauf warten, dass 100.000 Datensätze vom LDAP-Server an den App-Server übergeben werden, selbst wenn sie in 1.000er-Chunks aufgeteilt sind.
Ich verstehe, dass DirectoryServices.Protocols SearchRequest hat, mit dem Sie wahrscheinlich einen "PageResultRequestControl" verwenden können, der anscheinend das bietet, wonach ich suche (obwohl es so aussieht, als käme die Seitenumbruchsinformation in "Cookies", die ich nicht weiß, wie ich sie abrufen soll). Aber wenn es einen Weg gibt, dies zu tun, ohne das gesamte Ding neu schreiben zu müssen, um Protokolle zu verwenden, würde ich das lieber vermeiden.
Ich kann mir einfach nicht vorstellen, dass es keinen Weg gibt, dies zu tun... Sogar SQL hat Row_Number.
UPDATE: Der PageResultRequestControl hilft nicht - er ist nur vorwärts und sequenziell (Sie müssen die ersten N Ergebnisse abrufen, bevor Sie das "Cookie"-Token erhalten, das für einen Aufruf benötigt wird, um das Ergebnis N+1 zu erhalten).
Das Cookie scheint jedoch eine Art reproduzierbare Reihenfolge zu haben... Bei einem Ergebnisdatensatz, an dem ich gearbeitet habe, habe ich jedes Mal, wenn ich durch die Ergebnisse iteriert habe, folgendes Cookie erhalten:
1: {8, 0, 0, 0}
2: {11, 0, 0, 0}
3: {12, 0, 0, 0}
4: {16, 0, 0, 0}
Als ich zwei nach zwei durchiteriert habe, habe ich die gleichen Zahlen erhalten (11, 16). Das lässt mich glauben, dass, wenn ich den Code herausfinden könnte, wie diese Zahlen generiert werden, ich ein Cookie ad-hoc erstellen könnte, das mir genau das Paging geben würde, das ich suche.