2016-06-16 26 views
7

Mam trochę kodu (poniżej), który jest uruchamiany co 15 minut. Czasami nie powiedzie kwerendy AD z powodu następującego błędu:Zapytanie stronicowania zapytań Czasami się nie uda

System.DirectoryServices.Protocols.DirectoryOperationException: The server does not support the control. The control is critical. 
    at System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest request, TimeSpan requestTimeout) 
  • Kiedy skończy się pomyślnie, cały proces trwa około jednej minuty, aby uruchomić z kwerendy AD biorąc około 30 sekund z 32 stron.
  • Kiedy się nie uda, zawsze jest na pierwszej stronie.
  • Wygląda na to, że nie ma błędu we wzorze (zawsze o różnych porach dnia), o ile wiem.

Po googling ten błąd, znalazłem dwa SO pytania (one, two) wskazujących użyciu AuthType.Ntlm aby rozwiązać ten problem. To jednak mnie nie rozwiązało. Another mówi, aby sprawdzić, czy serwer obsługuje stronicowanie (robi to).

Jakieś pomysły, dlaczego tak się dzieje?

var attributesToReturn = new[] { 
    "givenName", 
    "sn", 
    "middleName", 
    "extensionAttribute8", 
    "department", 
    "sAMAccountName", 
    "userAccountControl" 
}; 
var filter = "(&(objectclass=user)(!(objectclass=computer))(sn=*)(givenName=*)(extensionAttribute8=*)(|(sn=a*)(sn=b*)(sn=c*)(sn=d*)(sn=e*)(sn=f*)(sn=g*)(sn=h*)(sn=i*)(sn=j*)(sn=k*)(sn=l*)(sn=m*)(sn=n*)(sn=o*)(sn=p*)(sn=q*)(sn=r*)(sn=s*)(sn=t*)(sn=u*)(sn=v*)(sn=w*)(sn=x*)(sn=y*)(sn=z*)))"; 
var currentBatch = 1; 
var searchRequest = new SearchRequest("DC=foo,DC=bar,DC=baz", filter, SearchScope.Subtree, attributesToReturn); 
var pageRequestControl = new PageResultRequestControl(500); 
searchRequest.Controls.Add(pageRequestControl); 

using (var ldapConnection = new LdapConnection("server.foo.bar.baz")) 
{ 
    ldapConnection.Credential = new NetworkCredential("user", "pass", "domain"); 
    ldapConnection.Timeout = new TimeSpan(0, 4, 0); 
    ldapConnection.AuthType = AuthType.Ntlm; // https://stackoverflow.com/a/14255413 

    while (true) 
    { 
     log.Debug("Fetching batch {0} from AD", currentBatch); 
     var searchResponse = (SearchResponse)ldapConnection.SendRequest(searchRequest); 
     var pageResultResponse = (PageResultResponseControl)searchResponse.Controls[0]; 

     log.Debug("Parsing AD response for batch {0}", currentBatch); 
     ParseResponse(_return, searchResponse, includeDisabled); 
     if (pageResultResponse.Cookie.Length == 0) 
      break; 
     pageRequestControl.Cookie = pageResultResponse.Cookie; 
     currentBatch++; 
    } 
} 
+0

Czy próbowałeś wyrzucać przedmioty, które tworzysz? – Shago

+0

@Shago 'LdapConnection' to jedyny obiekt jednorazowy, którego używam i który jest obsługiwany za pomocą instrukcji' using'. – Chris

+0

W jakim oświadczeniu jest ten wyjątek? –

Odpowiedz

0

Nie może to być problem, ponieważ nie tylko dla was czasami, ale miałem ten błąd za każdym razem i musiał ustawić

ldapConnection.SessionOptions.ProtocolVersion=3 

go do pracy w ogóle.