Я собираюсь запустить соединение 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 также не нужно блокировки. Кто-нибудь знает это? Или поделились некоторыми ссылками по этому вопросу?