Ldap соединения по StartTLS застряли, если без блокировки - PullRequest
0 голосов
/ 14 апреля 2020

Я собираюсь запустить соединение TLS для LDAP. Я настроил SSL / TlS в моем тестовом домене: uca-e2013.wm.zhu.cn.qsft. Затем я пишу некоторый тестовый код и обнаруживаю, что соединение ldap всегда застревает в многопоточности, затем я добавляю блокировку, чтобы избежать этого. вопрос. Вот мой C# код:

class Program
{
    private static object _lock = new object();
    private static bool _needLock = true;
    static void Main(string[] args)
    {
        int repeatTimes = 0;
        List<Task> tasks = new List<Task>();

        while (repeatTimes >= 0)
        {
            Console.WriteLine("Multithreaded TLS connects to ldap with lock? Y: Yes, N: No");
            var isLockInput = Console.ReadLine();

            if(isLockInput.Equals("n",StringComparison.CurrentCultureIgnoreCase))
            {
                _needLock = false;
            }

            Console.WriteLine("How many task need to create ?");
            repeatTimes = int.Parse(Console.ReadLine());

            for (var i = 0; i < repeatTimes; i++)
            {
                var task = Task.Factory.StartNew(() =>
                {
                    LdapTlsConnect();
                });

                tasks.Add(task);
            }

            Task.WaitAll(tasks.ToArray());
        }
    }

    private static void LdapTlsConnect()
    {
        try
        {
            var identifier = 
                new LdapDirectoryIdentifier("uca-e2013-dc.uca-e2013.wm.zhu.cn.qsft", 3268);
            LdapConnection conn = new LdapConnection(identifier);
            conn.SessionOptions.ProtocolVersion = 3;

            try
            {
                if (_needLock)
                {
                    lock (_lock)
                    {
                        conn.SessionOptions.StartTransportLayerSecurity(null);
                        conn.Bind();
                    }
                }
                else
                {
                    conn.SessionOptions.StartTransportLayerSecurity(null);
                    conn.Bind();
                }
            }
            catch (Exception e)
            {
                Console.WriteLine("Bind fails: " + e.ToString());
            }

            conn.SessionOptions.StopTransportLayerSecurity();
            Console.WriteLine("Done:{0}", Task.CurrentId);
            conn.Dispose();

        }
        catch (Exception e)
        {
            Console.WriteLine("Exception: " + e.ToString());
        }

    }
}

Он работает хорошо при вводе "Y" и зависает после ввода "N". И я хочу знать, почему? Это так странно. Я подключаю ldap обычным или SSl также не нужно блокировки. Кто-нибудь знает это? Или поделились некоторыми ссылками по этому вопросу?

...