相关疑难解决方法(0)

使用DirectorySearcher.FindAll()时内存泄漏

我有一个漫长的运行过程,需要经常在Active Directory上进行大量查询.为此,我一直在使用Directory.DirectoryServices命名空间,使用DirectorySearcher和DirectoryEntry类.我注意到应用程序中存在内存泄漏.

可以使用以下代码复制:

while (true)
{
    using (var de = new DirectoryEntry("LDAP://hostname", "user", "pass"))
    {
        using (var mySearcher = new DirectorySearcher(de))
        {
            mySearcher.Filter = "(objectClass=domain)";
            using (SearchResultCollection src = mySearcher.FindAll())
            {
            }            
         }
    }
}
Run Code Online (Sandbox Code Playgroud)

这些类的文档说如果没有调用Dispose(),它们将泄漏内存.我试过没有处理过,它只是泄漏了更多的内存.我用框架版本2.0和4.0测试了这个以前有人遇到过这个吗?有没有解决方法?

更新:我尝试在另一个AppDomain中运行代码,它似乎也没有帮助.

.net c# directoryservices memory-leaks adsi

25
推荐指数
2
解决办法
1万
查看次数

System.DirectoryServices.DirectorySearcher导致"算术运算导致溢出"错误

我收到以下与使用DirectorySearcher.FindOne()或查询AD相关的间歇性错误 FindAll().

System.OverflowException: Arithmetic operation resulted in an overflow.
     at System.DirectoryServices.SearchResultCollection.ResultsEnumerator.GetCurrentResult()
     at System.DirectoryServices.SearchResultCollection.ResultsEnumerator.get_Current()
     at System.DirectoryServices.SearchResultCollection.ResultsEnumerator.System.Collections.IEnumerator.get_Current()
Run Code Online (Sandbox Code Playgroud)

这是在一个Web应用程序中发生的,似乎是在应用程序运行了几个小时后发生的.

这是Microsoft Connect上的文档问题,但看起来它已标记为"不可重现"并已关闭.

我在这里找到的唯一解决方案是定期回收应用程序池,这是一个相当苛刻的解决方法,当用户处于工作中时不可行.

有没有人经历过这个,如果是这样,这是如何解决的?

我曾尝试使用缓存,但这只会延迟不可避免的事情,直到你达到AD调用次数的某个阈值,因为人们已经报告每次调用API时它会泄漏内存.

任何帮助将非常感激.

.net directoryservices memory-leaks active-directory

23
推荐指数
1
解决办法
2099
查看次数