Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Novell.Directory.Ldap.NETStandard和简单分页结果控件在Ldap服务器上进行分页搜索?_C#_.net Core_Active Directory_Ldap - Fatal编程技术网

C# 如何使用Novell.Directory.Ldap.NETStandard和简单分页结果控件在Ldap服务器上进行分页搜索?

C# 如何使用Novell.Directory.Ldap.NETStandard和简单分页结果控件在Ldap服务器上进行分页搜索?,c#,.net-core,active-directory,ldap,C#,.net Core,Active Directory,Ldap,我正在尝试使用Novell.Directory.Ldap.NETStandard()和简单分页结果控件()在Active Directory中进行分页搜索 第一个页面工作正常,但第二个页面在searchResult.next()行抛出“不可用的关键扩展”。在事件日志中查找ActiveDirectory时,我发现: 00000057:LDAPPER:DSID-0C090809,注释:错误处理控制,数据0,v23f0 0000208D:NameErr:DSID-03100213,问题2001(无对象

我正在尝试使用Novell.Directory.Ldap.NETStandard()和简单分页结果控件()在Active Directory中进行分页搜索

第一个页面工作正常,但第二个页面在searchResult.next()行抛出“不可用的关键扩展”。在事件日志中查找ActiveDirectory时,我发现:

00000057:LDAPPER:DSID-0C090809,注释:错误处理控制,数据0,v23f0 0000208D:NameErr:DSID-03100213,问题2001(无对象),数据0,最佳匹配:

我们还尝试了LdapVirtualListControl,但遇到了另一个问题,请参阅

下面是我们用于复制的简化代码:

        // Connection
        var ldapConn = new LdapConnection()
        {
            SecureSocketLayer = true,
        };
        ldapConn.UserDefinedServerCertValidationDelegate += (sender, certificate, chain, sslPolicyErrors) => true;
        ldapConn.Connect(host, 636);
        ldapConn.Bind(username, password);

        // Constraints
        LdapSearchConstraints searchConstraints = (LdapSearchConstraints)_conn.SearchConstraints.Clone();
        int pageSize = 100, count = 0;
        bool exit = false;
        const string LDAP_SERVER_SIMPLE_PAGED_RESULT_OID = "1.2.840.113556.1.4.319";

        LdapControl pageControl = null;

        do
        {
            int inPageCount = 0;

            // Add Simple Paged Result control
            var request = new Asn1Sequence(2);
            request.add(new Asn1Integer(pageSize));
            request.add(pageControl == null ? new Asn1OctetString("") : new Asn1OctetString(pageControl.getValue()));
            searchConstraints.setControls(
                new LdapControl(LDAP_SERVER_SIMPLE_PAGED_RESULT_OID, true, request.getEncoding(new LBEREncoder()))
            );

            // Get search result
            var searchResult = (LdapSearchResults)ldapConn.Search(container, LdapConnection.SCOPE_SUB, query, null, false, searchConstraints);
            while (searchResult.hasMore())
            {

                // Detect simple paged result control
                pageControl = searchResult.ResponseControls?.Where(rc => rc.ID == LDAP_SERVER_SIMPLE_PAGED_RESULT_OID).FirstOrDefault();
                if (pageControl != null) break;

                var nextEntry = searchResult.next();
                inPageCount++;

            }
            count += inPageCount;

            // Exit if no more pages
            exit = pageControl == null;

        } while (!exit);
为什么代码不工作 根据简单的分页结果控件编码为

realSearchControlValue::=SEQUENCE{
大小整数(0..maxInt),
--从客户端请求的页面大小
--来自服务器的结果集大小估计
cookie八位组字符串
}
在下一个截图(摘自Wireshark)中可以清楚地看到这一点

:

当客户端向请求添加控件时,size设置为页面中所需的元素数,cookie是来自上一个服务器响应的不透明结构(第一个请求为空)

尝试在请求中构造控件时,错误地添加了整个控件值而不是cookie(pageControl.getValue()):

var请求=新的asn1序列(2);
添加(新的Asn1Integer(pageSize));
add(pageControl==null?新建ASN10ctetString(“”):新建ASN10ctetString(pageControl.getValue());
它使第一个请求之后的所有请求都不正确

提议的解决办法 看一看。 我已经创建了类型化的简单分页结果控制实现,它封装了解码/编码逻辑。对于来自Active Directory的100000多个条目,这对我来说非常好


测试应用程序显示了基本用法。

太棒了,我查看了您的github repo,修复了我们的代码,它的工作方式很有魅力:-)非常感谢!很高兴听到。请将答案标记为已接受,以便其他人能够更快地找到解决方案。