dotnet/runtime

LdapConnection.GetPartialResults() fails with timeout in Linux

Open

#100.442 geöffnet am 29. März 2024

Auf GitHub ansehen
 (1 Kommentar) (0 Reaktionen) (0 zugewiesene Personen)C# (5.445 Forks)batch import
area-System.DirectoryServiceshelp wanted

Repository-Metriken

Stars
 (17.886 Stars)
PR-Merge-Metriken
 (Durchschn. Merge 12T 11h) (661 gemergte PRs in 30 T)

Beschreibung

Description

Hi! I use System.DirectoryServices.Protocols LdapConnection.GetPartialResults() with AD. I've found that behavior of client at Windows and Linux is differs.

"System.DirectoryServices.Protocols" Version="8.0.0" (net8)

At windows it work as expected. At linux GetPartialResults() throws error with timeout:

System.DirectoryServices.Protocols.LdapException: The operation was aborted because the client side timeout limit was exceeded. 
   at System.DirectoryServices.Protocols.LdapPartialResultsProcessor.GetPartialResults(LdapPartialAsyncResult asyncResult)

Increasing the timeout causes the operation stuck (operation never ends).

I don't understand, how it must be used properly for Linux.

Usage:

        var sendRequestAsyncResult = ldapConnection.BeginSendRequest(request, PartialResultProcessing.ReturnPartialResults, null, ldapConnection);
        var result = new List<SearchResultEntry>();
        while (!cancellationToken.IsCancellationRequested && !sendRequestAsyncResult.IsCompleted)
        {
            PartialResultsCollection partialResults;
            try
            {
                cancellationToken.ThrowIfCancellationRequested();
                if (sendRequestAsyncResult.IsCompleted)
                    return result;
                partialResults = ldapConnection.GetPartialResults(sendRequestAsyncResult);
            }
#pragma warning disable S2737
            catch (DirectoryOperationException e) when (e.Message.Equals("The size limit was exceeded", StringComparison.Ordinal))
            {
                throw;
                //return result;
            }
#pragma warning restore S2737
            var entries = partialResults.OfType<SearchResultEntry>().ToList();
            if (entries.Count > 0) //in Linux count is 0
            {
                result.AddRange(entries);
            }
        }

If I use SendRequest(), it's works correctly. GetPartialResults() didn't work correctly with same request.

Reproduction Steps

use LdapConnection.GetPartialResults() and SendRequests(), results are differs.

Expected behavior

IMHO, results of GetPartialResults() process and SendRequests() must be equal.

Actual behavior

timeout occurs without any understandable reasons

Regression?

No response

Known Workarounds

No response

Configuration

Linux (ubuntu 20.04) ActiveDirectory LDAPv3

Other information

No response

Contributor Guide