【问题标题】:DirectoryEntry instance are not disposed in LDAPDirectoryEntry 实例未在 LDAP 中配置
【发布时间】:2020-10-07 05:20:39
【问题描述】:

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

运行以下代码后

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 中处理?这是一个已知问题吗?

【问题讨论】:

    标签: ldap netstat directoryentry directorysearcher


    【解决方案1】:

    可能会发生两种情况之一。

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

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

    【讨论】:

    • 我已尝试在我的应用程序中排除任何未处置的 DirectoryEntry。并创建了一个执行 DirectoryEntry 的应用程序。它给了我同样的结果。此外,连接状态保持 ESTABLISHED 直到我的应用程序关闭,然后才将其删除
    • 如果应用程序关闭时连接消失,那么肯定是连接缓存。但我不能自己复制这个。如果我创建一个在using 内有一个DirectoryEntry 的控制台应用程序,然后在using 之后暂停,当我使用Process Monitor 监视它时,我会看到连接断开。但是,如果我在using 之外再保留一个DirectoryEntry,则连接将保持打开状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-04
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-11
    相关资源
    最近更新 更多