LdapConnectionSearchRequestThrows"SizeLimitExceeded"Exception由于我们需要使用LDAPS连接LDAP服务器,所以必须使用LdapConnection而不是DirectoryEntry。这是源代码:SearchResponse响应;使用(LdapConnectioncon=newLdapConnection(newLdapDirectoryIdentifier(Host,Port))){if(IsSSL){con.SessionOptions.SecureSocketLayer=true;con.SessionOptions.VerifyServerCertificate=(connection,certificate)=>true;}con.Credential=newNetworkCredential(_username,_password);con.AuthType=AuthType.Basic;con.Bind();if(logMessage!=null)logMessage("连接到LDAP");字符串sFilter=String.Format("(&(objectcategory=person)(objectclass=user){0}(!(userAccountControl:1.2.840.113556.1.4.803:=2)))",filter);SearchRequestrequest=newSearchRequest("OU=Corp,DC=mydc,DC=com",sFilter,SearchScope.Subtree);request.Attributes.Add(Resources.objectguid);request.Attributes.Add(Resources.givenname);request.Attributes.Add(Resources.sn);request.Attributes.Add(Resources.initials);request.Attributes.Add(Resources.samaccountname);request.Attributes.Add(Resources.userprincipalname);请求.Aattributes.Add(Resources.mail);request.Attributes.Add(Resources.objectsid);request.Attributes.Add(Resources.department);request.Attributes.Add(Resources.company);请求.SizeLimit=10;response=(SearchResponse)con.SendRequest(request);执行源代码后(我们验证了凭据、主机、端口等。处理的异常查看堆栈跟踪以获取有关错误及其在代码中的起源位置的更多信息。异常详细信息:System.DirectoryServices.Protocols.DirectoryOperationException:超出大小限制来源错误:response=(SearchResponse)con.SendRequest(request);[DirectoryOperationException:超出大小限制]System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32messageId,LdapOperation操作,ResultAllresultType,TimeSpanrequestTimeOut,BooleanexceptionOnTimeOut)+2385System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest请求,TimeSpanrequestTimeout)+499System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequestrequest)+50UserSearchProvider.ADUserSearchProvider.QueryStore(UserSearchCriteriaCollectionCriterias,Action1logMessage)inc:UsersstemarieDocumentsVisualStudio2012ProjectsIdealink.ModulesUserSearchProviderUserSearchProviderADUserSearchProvider.cs:298UserSearchProvider.UserSearchProvider.QueryAndSort(UserSearchCriteriaCollectioncriterias,Action1logMessage)在c:UsersstemarieDocumentsVisualStudio2012ProjectsIdealink.ModulesUserSearchProviderUserSearchProviderUserSearchProvider.cs:77UserSearchProvider.UserSearchProvider.Search(UserSearchCriteriaCollectioncriterias,Action1logMessage)inc:UsersstemarieDocumentsVisualStudio2012ProjectsIdealink.ModulesUserSearchProviderUserSearchProviderUserSearchProvider.cs:33UserSearchProvider.UserSearchService.Search(UserSearchCriteriaCollectioncriterias,Action1logMessage)inc:UsersstemarieDocumentsVisualStudio2012ProjectsIdealink.ModulesUserSearchProviderUserSearchProviderUserSearchProvider.cs:33UserSearchProvider.UserSearchService.Search(UserSearchCriteriaCollectioncriterias,Action1logMessage)在c:UsersstemarieDocumentsVisualStudio2012ProjectsIdeaearch4ModulesUserSearchProvider4UserSearchProviderUserSearchProviderUserSearchProvider.UserSearchService.SearchUserSearchProviderTest._Default.Page_Load(Objectsender,EventArgse)位于c:UsersstemarieDocumentsVisualStudio2012项目Idealink.ModulesUserSearchProviderUserSearchProviderTestDefault.aspx.cs:28困扰我的部分是我们确实指定了最大大小限制并且我们不希望超过100个条目-我们想要限制它但即使我们将SizeLimit指定为1,库也会不断抛出错误。有没有人对这个问题有任何见解/建议?我们非常接近完成这项工作,只需要解决最后一个问题。您应该在与此类似的功能中使用cookie。此函数返回SearchResponse对象的集合,调用者应循环访问这些对象。privateListSearchDirectory(stringdistinguishedName,stringsearchFilter,System.DirectoryServices.Protocols.SearchScopesearchScope,paramsstring[]attributeList){Listresult=newList();SearchResponse响应=null;intmaxResultsToRequest=100;尝试{PageResultRequestControlpageRequestControl=newPageResultRequestControl(maxResultsToRequest);//用于获取cookie为后续请求发送PageResultResponseControlpageResponseControl;SearchRequestsearchRequest=newSearchRequest(distinguishedName,searchFilter,searchScope,attributeList);searchRequest.Controls.Add(pageRequestControl);while(true){response=(SearchResponse)connection.SendRequest(searchRequest);结果。添加(响应);pageResponseControl=(PageResultResponseControl)response.Controls[0];如果(pageResponseControl.Cookie.Length==0)中断;pageRequestControl.Cookie=pageResponseControl.Cookie;}}catch(Exceptione){//做一些机智的事情h错误}返回结果;}事实证明,这是有效的:try{response=(SearchResponse)con.SendRequest(request);返回response.Entries.Cast().Select(entry=>entry.Attributes).Select(x=>GetADUserSearchItemFromADProperties(x,logMessage)).Where(user=>user.HasName).Cast();}catch(DirectoryOperationExceptionex){response=(SearchResponse)ex.Response;returnresponse.Entries.Cast().Select(entry=>entry.Attributes).Select(x=>GetADUserSearchItemFromADProperties(x,logMessage)).Where(user=>user.HasName).Cast();}MSDN文档指出您将DirectoryResponse类作为DirectoryOperationException.Response属性获取。但是,您可以将此属性强制转换为SearchResponse类型,然后使用SearchResponse.Entries属性获取在SizeLimit被命中之前收到的条目。我试过这个并得到了预期的结果,我只是有点恼火,因为我必须处理异常才能执行操作。以上就是C#学习教程的全部内容:LdapConnectionSearchRequest抛出“超出大小限制”的异常。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
