Chr*_*ass 7 c# pagination web-services ldap .net-4.0
我正在使用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",它看起来像我正在寻找的东西(虽然它看起来像分页信息来自"cookies",我不确定我应该如何检索).但是,如果有一种方法可以做到这一点,而不是重写整个事物而不是使用协议,我宁愿不必这样做.
我无法想象没有办法做到这一点......甚至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}
Run Code Online (Sandbox Code Playgroud)
当我逐两迭代时,我得到了相同的数字(11,16).这让我觉得,如果我能弄清楚这些数字是如何生成的代码,我可以创建一个ad-hoc cookie,这将给我一个我正在寻找的分页.
遗憾的是,鉴于当前的 C# 库,似乎没有办法做到这一点。
所有标准 C#4.0 LDAP 库都返回前 N 个结果(如 FindAll(),它返回每个结果,FindOne(),它返回第一个结果,或者 SearchResult 和 PageResultRequestControl,它返回结果 N 到 N+M但要求您先检索结果 1 到 N-1,然后才能获得可与请求一起传递的 cookie 令牌,以便获取下一组结果。
我也没有找到任何允许这样做的第三方 LDAP 库。
除非找到更好的解决方案,否则我的前进方向将是修改界面以显示前 X 个结果,而不具有客户端分页功能(显然仍然酌情使用服务器端分页)。
我可能会在以后追求只进寻呼系统,通过将更新的 cookie 与响应一起传递给客户端,然后通过单击“更多结果”类型的按钮将其传回。不管这些饼干是否可以手工制作,以后可能值得追求。
更新:我与 Microsoft 支持人员交谈并确认了这一点 - 无法使用 LDAP 服务器进行动态分页。这是 LDAP 服务器本身的限制。
你可以使用Protocols和Paging控件(如果你的LDAP服务器支持的话)随意前进,但是cookie没有跨服务器(甚至跨版本)的标准,因此你无法合理地制作自己的,并且不能保证 cookie 可以重复用于重复查询。
完整的解决方案涉及使用协议(如上所述的分页)将可分页结果集拉入 SQL,无论是临时表还是永久存储表,并允许用户以传统方式对该结果集进行分页和排序。请记住,您的结果不会完全是最新的,但通过一些智能缓存更新,您可以最大限度地降低这种风险。
| 归档时间: |
|
| 查看次数: |
2553 次 |
| 最近记录: |