首页 > 解决方案 > DirectoryEntry 实例未在 LDAP 中配置

问题描述

我不确定这是否是预期的行为,但我希望它会采取不同的行动。

运行以下代码后

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 中处理有什么原因吗?这是一个已知的问题?

标签: ldapnetstatdirectoryentrydirectorysearcher

解决方案


可能会发生两件事之一。

  1. 连接实际上是关闭的。第二次运行 netstat 时,如果连接状态显示CLOSE_WAITTIME_WAIT而不是ESTABLISHED,那么就是这种情况:连接确实关闭了。连接会在该状态下保持一段时间,以防该连接的某些数据包延迟到达。

  2. DirectoryEntry是原生Windows Active Directory 服务接口(ADSI) 的包装器。它内置了一些每个进程的连接缓存。因此,如果您DirectoryEntry的应用程序中有另一个使用相同连接的未处置,那么处置第二个DirectoryEntry将不会关闭该连接。只要DirectoryEntry您的应用程序中至少有一个未释放的连接,该连接就会保持打开状态。


推荐阅读