Экземпляр DirectoryEntry не удаляется в LDAP - PullRequest
0 голосов
/ 17 июня 2020

Я не уверен, что это ожидаемое поведение, но я ожидал бы, что оно будет действовать по-другому.

После выполнения следующего кода

using (var directoryEntry = new DirectoryEntry(
    directoryPath,
    ConfigurationManager.AppSettings["ldapUsername"],
    ConfigurationManager.AppSettings["ldapPassword"],
    AuthenticationTypes.Anonymous))
{
    // ldap query
}

Когда запрос выполняется и , как я и ожидал, я мог видеть активный сеанс на LDAP.

Выполните следующую команду на машине LDAP:

netstat -nat | findstr my_ip_address | findstr :389

Я смог увидеть активный сеанс на LDAP:

TCP ldap_ip_address:389 my_ip_address:24730 ESTABLISHED InHost 

Но когда мы выходим из раздела using и удаляем DirectoryEntry / DirectorySearcher, я бы ожидал, что сеанс будет закрыт. Тем не менее, когда я снова запустил команду netstat, я увидел тот же активный сеанс.

Есть ли причина, по которой сеанс не удаляется в LDAP? Это известная проблема?

1 Ответ

0 голосов
/ 17 июня 2020

Может произойти одно из двух.

  1. Соединение фактически закрыто. Во второй раз, когда вы запускаете netstat, если в состоянии подключения отображается CLOSE_WAIT или TIME_WAIT вместо ESTABLISHED, значит, это так: соединение действительно было закрыто. Соединение удерживается в этом состоянии некоторое время на случай, если некоторые пакеты для этого соединения прибудут с опозданием.

  2. DirectoryEntry - это оболочка для собственных Windows служб Active Directory. Интерфейсы (ADSI). Он имеет встроенное кеширование соединений для каждого процесса . Поэтому, если в вашем приложении есть еще один не удаленный DirectoryEntry, использующий то же соединение, то удаление второго DirectoryEntry не приведет к закрытию этого соединения. Соединение остается открытым, пока в вашем приложении есть хотя бы один не удаленный DirectoryEntry.

...