2009-10-29 6 views
4

J'essaie de faire une recherche paginée sur un annuaire LDAP iPlanet. Voici mon code: «Le serveur ne supporte pas le contrôle Le contrôle est essentiel »iPlanet LDAP et C# PageResultRequestControl

LdapConnection ldap = new LdapConnection("foo.bar.com:389"); 
ldap.AuthType = AuthType.Anonymous; 
ldap.SessionOptions.ProtocolVersion = 3; 
PageResultRequestControl prc = new PageResultRequestControl(1000); 
string[] param = new string[] { "givenName" }; 
SearchRequest req = new SearchRequest("ou=people,dc=bar,dc=com", "(ou=MyDivision)", SearchScope.Subtree, param); 
req.Controls.Add(prc); 
while (true) 
{ 
    SearchResponse sr = (SearchResponse)ldap.SendRequest(req); 
    ... snip ... 
} 

Quand je lance, je reçois une exception qui indique sur la ligne avant la snip. La recherche rapide sur Google ne révèle rien. Est-ce que iPlanet prend en charge la pagination? Si oui, qu'est-ce que je fais de mal? Merci.

Répondre

10

Tous les répertoires compatibles LDAP v3 doivent contenir une liste d'OID pour les contrôles pris en charge par le serveur. Vous pouvez accéder à la liste en lançant une recherche au niveau de base avec un DN racine de recherche vide/vide pour obtenir la racine DSE du serveur d'annuaire et lire l'attribut multi-valeur supportedControl. L'OID pour le support de recherche paginée est 1.2.840.113556.1.4.319.

Voici un extrait de code pour vous lancer:

LdapConnection lc = new LdapConnection("ldap.server.name"); 
// Reading the Root DSE can always be done anonymously, but the AuthType 
// must be set to Anonymous when connecting to some directories: 
lc.AuthType = AuthType.Anonymous; 
using (lc) 
{ 
    // Issue a base level search request with a null search base: 
    SearchRequest sReq = new SearchRequest(
    null, 
    "(objectClass=*)", 
    SearchScope.Base, 
    "supportedControl"); 
    SearchResponse sRes = (SearchResponse)lc.SendRequest(sReq); 
    foreach (String supportedControlOID in 
    sRes.Entries[0].Attributes["supportedControl"].GetValues(typeof(String))) 
    { 
    Console.WriteLine(supportedControlOID); 
    if (supportedControlOID == "1.2.840.113556.1.4.319") 
    { 
     Console.WriteLine("PAGING SUPPORTED!"); 
    } 
    } 
} 

Je ne pense pas que iPlanet soutient radiomessagerie mais cela pourrait dépendre de la version que vous utilisez. Les versions plus récentes des répertoires Sun-made semblent prendre en charge la pagination. Il vaut probablement mieux vérifier votre serveur en utilisant la méthode que j'ai décrite.

+0

Vous avez raison, ce serveur ne prend pas en charge la pagination. Je vais trouver la version que nous utilisons et s'il y a des plans de mise à niveau. Merci! – ristonj

+1

+1: Super, bonne réponse. – Doug