DirectorySearch.PageSize = 2不起作用

Ber*_*ero 5 c# active-directory

     using (DirectorySearcher srch = new DirectorySearcher(String.Format("(memberOf=  {0})",p_Target.DistinguishedName)))
     {
            srch.PageSize = 2;
            SearchResultCollection results = results = srch.FindAll();
            int count = results.Count;
     }
Run Code Online (Sandbox Code Playgroud)

count = 3(THREE)而不是2.为什么?我不希望只在一个页面中获得所有结果.我知道PageSize = 2很小,但我在这种情况下设置的值只是为了测试目的(实际上它会更多).

Har*_*wok 6

pageSize用于设置一次分页搜索中返回的记录数.分页搜索是LDAP协议级别的基础.这对你来说很透明.虽然您将PageSize设置为2,但DirectorySearcher将为您返回所有结果,但在您的情况下会返回两个分页搜索回复数据包.

要做你想做的事,你应该使用SizeLimit.它将控制总共返回的记录数.

这是一个更棘手的事情.Windows Server在服务器端设置了限制.在每个分页搜索结果中,它最多只能返回1000个条目.因此,如果结果超过1000个,则需要小心设置PageSize和SizeLimit.如果您设置PageSize = 0(意味着无限制)和SizeLimit = 0(意味着无限制),您将收到一个错误,因为Windows服务器无法在一个页面中返回超过1000个条目.如果您设置Pagesize = 800和SizeLimit = 0(意味着无限制),您将获得所有结果,如果您查看网络嗅探器,您将看到有一堆LDAP分页搜索结果.在每个分页搜索结果中,您会看到800个条目.

编辑

以下是对您评论中问题的详细回复.

嗯,有趣.请帮助我更好地了解这种机制:如果在AD我有5000行,的DirectorySearcher的每页被设定在1000,的sizeLimit被设置为0,最大服务器限制为1000如何directorySearcher.FindAll()我需要有许多电话我的代码获得全部5000个结果?5或1

无论要返回多少条记录,您始终只需要在DirectorySearcher上进行一次调用.DirectorySearcher将为您处理剩下的事情.它将聚合分页搜索结果并在一个IEnumerable中呈现给您,即使数据可能来自不同的回复数据包.我想你想设置PageLimit,因为你不希望所有5000个结果同时返回并占用你的记忆.别担心.只要您没有在每个返回的SearchResult上保留引用,DirectorySearcher就不会将所有5000个结果存储在您的内存中.它不会等到所有回复数据包都返回.一旦第一个回复数据包返回,FindAll()就会将结果返回给您.如果你的程序太快,在处理1000个结果后,第二个分页搜索结果包仍然没有到达.MoveNext()上的调用将被阻止,并等待接收到第二个分页搜索结果数据包.