[c#] 在.Net 4.0中,DirectorySearch可以以某种方式返回LDAP结果,以便通过它们进行翻页?



Answers

不幸的是,看来可能没有办法做到这一点目前的C#库。

所有标准的C#4.0 LDAP库都会返回Top-N结果(如:返回每个结果的FindAll(),返回第一个结果的FindOne()或返回带有PageResultRequestControl的SearchResult的SearchResult,返回结果N到N + M但要求您在检索结果1到N-1之前获得一个cookie标记,您可以通过该标记传递请求以获取下一个设置。

我还没有找到任何允许这个的第三方LDAP库。

除非找到更好的解决方案,否则我的路径是将接口修改为显示前X个结果,而没有客户端分页功能(显然仍使用服务器端分页)。

在稍后的日子,我可以通过将更新后的cookie传递给客户端,并通过单击“更多结果”类型的按钮将其传递回客户端。 不管这些饼干是否可以手工制作,在以后的日子里都值得一试。

更新:我与Microsoft支持交谈,并证实这一点 - 没有办法做到与LDAP服务器动态分页。 这是LDAP服务器本身的限制。

您可以使用Protocols和Paging控件(如果您的LDAP服务器支持它)随意前进,但是没有跨服务器(甚至是跨版本)的Cookie标准,所以您不能合理地制作自己的,并不能保证cookie可以被重复用于重复查询。

一个完整的解决方案涉及使用协议(使用上面的Paging)将您的可分页结果集合放入SQL中,无论是将其放入临时表还是永久存储表中,并允许用户以传统方式对该结果集进行分页和排序。 请记住,您的结果不会精确地更新,但是通过一些智能缓存更新,您可以最大限度地降低风险。

Question

我正在使用C#,并试图使用DirectorySearch查询一个非常大的Microsoft ActiveDirectory LDAP服务器的组。

所以,在我的应用程序中,我将拥有一个分组列表,具有搜索功能。 当然,我不想在每次点击“下一页”时将我的整个结果集传给我的LDAP服务器。

有没有办法,使用DirectorySearch来检索一个单一的任意页面的结果,而不是返回一个方法调用的整个结果集?

类似的问题:

像这样的问题存在很多,有人询问分页(从LDAP服务器到应用服务器),并获得涉及PageSize和SizeLimit的响应。 但是,这些属性只影响C#服务器和LDAP服务器之间的分页,最终,DirectorySearch唯一相关的方法是FindOne()和FindAll()。

我正在寻找的基本上是“FindPaged(pageSize,pageNumber)”(pageNumber是真正重要的位,我不只是想要前1000个结果,我想(例如)第100组1000结果。应用程序不能等待100,000个记录从LDAP服务器传递到应用程序服务器,即使它们被分成1,000个记录块。

据我所知,DirectoryServices.Protocols具有SearchRequest,它(我认为?)允许您使用“PageResultRequestControl”,它看起来像我正在寻找(虽然它看起来像分页信息来“饼干”,我不知道我应该如何检索)。 但是如果有一种方法可以做到这一点,而不用重写整个事物来使用协议,我宁愿不必这样做。

我无法想象有没有办法做到这一点...即使SQL有Row_Number。

更新:PageResultRequestControl没有帮助 - 它只是向前和顺序的(你必须调用并获得前N个结果,然后才能获得调用获取结果N + 1所需的“cookie”标记)。

然而,cookie看起来似乎有某种可重复的排序......在我正在处理的结果集上,我通过结果逐一地迭代,每次cookie都出来了:

1: {8, 0, 0, 0}
2: {11, 0, 0, 0}
3: {12, 0, 0, 0}
4: {16, 0, 0, 0}

当我迭代两个,我得到了相同的数字(11,16)。 这使我想,如果我能弄清楚如何生成这些数字的代码,我可以创建一个特别的cookie,这将给我准确的分页,我正在寻找。




Links