DirectorySearch.PageSize = 2不起作用

时间:2011-01-14 16:25:02

标签: 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;
     }

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

2 个答案:

答案 0 :(得分: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行,PageSize   DirectorySearcher设置为1000,   SizeLimit设置为0和max server   限制是1000.多少次电话   directorySearcher.FindAll()我需要   在我的代码中获得所有5000   结果如何? 5或1

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

答案 1 :(得分:0)

请看Ethan Wilansky的这段代码和相关文章,

http://msdn.microsoft.com/en-us/magazine/dd250826.aspx?code=true&level=root&file=VLVSrch.cs

完全符合你的要求。