LdapConnection SearchRequest抛出异常的“大小限制超出”(LdapConn

2019-07-04 03:45发布

正因为如此,我们需要连接到使用LDAPS我们必须使用LdapConnection代替的DirectoryEntry LDAP服务器的事实。

这里是源代码:

        SearchResponse response;
        using (LdapConnection con = new LdapConnection(new LdapDirectoryIdentifier(Host, Port)))
        {
            if (IsSSL)
            {
                con.SessionOptions.SecureSocketLayer = true;
                con.SessionOptions.VerifyServerCertificate =
                    (connection, certificate)
                    => true;
            }
            con.Credential = new NetworkCredential(_username, _password);
            con.AuthType = AuthType.Basic;
            con.Bind();

            if (logMessage != null)
                logMessage("Connected to LDAP");

            string sFilter = String.Format(
                "(&(objectcategory=person)(objectclass=user){0}(!(userAccountControl:1.2.840.113556.1.4.803:=2)))",
                filter
                );

            SearchRequest request = new SearchRequest("OU=Corp,DC=mydc,DC=com", sFilter, SearchScope.Subtree);
            request.Attributes.Add(Resources.objectguid);
            request.Attributes.Add(Resources.givenname);
            request.Attributes.Add(Resources.sn);
            request.Attributes.Add(Resources.initials);
            request.Attributes.Add(Resources.samaccountname);
            request.Attributes.Add(Resources.userprincipalname);
            request.Attributes.Add(Resources.mail);
            request.Attributes.Add(Resources.objectsid);
            request.Attributes.Add(Resources.department);
            request.Attributes.Add(Resources.company);
            request.SizeLimit = 10;

            response = (SearchResponse) con.SendRequest(request);
        }

在源代码的执行(我们已经验证凭据,主机,端口等 - 使用外部第三方软件),我们得到以下异常:

大小超出上限

说明:在当前Web请求的执行过程中发生未处理的异常。 请检查堆栈跟踪有关该错误它起源于代码的详细信息和。

异常详细信息:System.DirectoryServices.Protocols.DirectoryOperationException:大小超出上限

源错误:

response = (SearchResponse) con.SendRequest(request);
 [DirectoryOperationException: The size limit was exceeded] System.DirectoryServices.Protocols.LdapConnection.ConstructResponse(Int32 

MESSAGEID,LdapOperation操作,ResultAll与resultType,时间跨度应为requestTimeout,布尔exceptionOnTimeOut)2385 System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest请求,时间跨度应为requestTimeout)499 System.DirectoryServices.Protocols.LdapConnection.SendRequest(DirectoryRequest请求)50 UserSearchProvider .ADUserSearchProvider.QueryStore(UserSearchCriteriaCollection指标分析,动作1 logMessage) in c:\Users\stemarie\Documents\Visual Studio 2012\Projects\Idealink.Modules\UserSearchProvider\UserSearchProvider\ADUserSearchProvider.cs:298 UserSearchProvider.UserSearchProvider.QueryAndSort(UserSearchCriteriaCollection criterias, Action在C 1的LogMessage):\用户\ stemarie \文件\的Visual Studio 2012 \项目\ Idealink.Modules \ UserSearchProvider \ UserSearchProvider \ UserSearchProvider.cs:77 UserSearchProvider.UserSearchProvider.Search(UserSearchCriteriaCollection指标分析,动作1 logMessage) in c:\Users\stemarie\Documents\Visual Studio 2012\Projects\Idealink.Modules\UserSearchProvider\UserSearchProvider\UserSearchProvider.cs:33 UserSearchProvider.UserSearchService.Search(UserSearchCriteriaCollection criterias, Action 1 logMessage) in c:\Users\stemarie\Documents\Visual Studio 2012\Projects\Idealink.Modules\UserSearchProvider\UserSearchProvider\UserSearchProvider.cs:33 UserSearchProvider.UserSearchService.Search(UserSearchCriteriaCollection criterias, Action 1周的LogMessage)在C:\用户\ stemarie \文件\的Visual Studio 2012 \项目\ Idealink.Modules \ UserSearchProvider \ UserSearchProvider \ UserSearchService.cs:44 UserSearchProviderTest._Default.Page_Load(对象发件人,EventArgs e)如C:\用户\ stemarie \文件\的Visual Studio 2012 \项目\ Idealink.Modules \ UserSearchProvider \ UserSearchProviderTest \ Default.aspx.cs:28

这让我困惑的部分是,我们做指定的最大大小限制,我们不希望超过100项 - 我们要限制它。 但尚未库始终抛出即使我们指定的1的sizeLimit的错误。

有没有人有任何关于此问题的任何见解/建议吗? 我们非常接近得到这方面的工作,只是需要解决这个最后的问题。

Answer 1:

你应该在类似这样的功能使用cookies。 该函数返回SearchResponse对象的集合,它调用者应该循环虽然。

private List<SearchResponse> SearchDirectory(string distinguishedName, string searchFilter, System.DirectoryServices.Protocols.SearchScope searchScope, params string[] attributeList)
{
    List<SearchResponse> result = new List<SearchResponse>();
    SearchResponse response = null;
    int maxResultsToRequest = 100;
    try
    {
        PageResultRequestControl pageRequestControl = new PageResultRequestControl(maxResultsToRequest);

        // used to retrieve the cookie to send for the subsequent request
        PageResultResponseControl pageResponseControl;
        SearchRequest searchRequest = new SearchRequest(distinguishedName, searchFilter, searchScope, attributeList);
        searchRequest.Controls.Add(pageRequestControl);

        while (true)
        {
            response = (SearchResponse)connection.SendRequest(searchRequest);
            result.Add(response);
            pageResponseControl = (PageResultResponseControl)response.Controls[0];
            if (pageResponseControl.Cookie.Length == 0)
                break;
            pageRequestControl.Cookie = pageResponseControl.Cookie;
        }
    }
    catch (Exception e)
    {
        // do something with the error

    }
    return result;
}


Answer 2:

事实证明,这个工程:

            try
            {
                response = (SearchResponse)con.SendRequest(request);

                return response.Entries.Cast<SearchResultEntry>()
                    .Select(entry => entry.Attributes)
                    .Select(x => GetADUserSearchItemFromADProperties(x, logMessage))
                    .Where(user => user.HasName)
                    .Cast<IUserSearchItem>();
            }
            catch (DirectoryOperationException ex)
            {
                response = (SearchResponse) ex.Response;
                return response.Entries.Cast<SearchResultEntry>()
                    .Select(entry => entry.Attributes)
                    .Select(x => GetADUserSearchItemFromADProperties(x, logMessage))
                    .Where(user => user.HasName)
                    .Cast<IUserSearchItem>();
            }

你得到一个MSDN文档DirectoryResponse类作为DirectoryOperationException.Response财产。 可以将此属性但是转换为SearchResponse类型,然后使用SearchResponse.Entries属性来获得您之前已经打到指定的sizeLimit收到的条目。

我曾尝试这样做,我得到预期的结果,我只是有点不高兴,我必须为了执行该操作有一个例外的工作。



文章来源: LdapConnection SearchRequest throws exception for “The size limit was exceeded”
标签: c# .net ldap