FindByIdentity в System.DirectoryServices.AccountManagment Проблемы с памятью - PullRequest
2 голосов
/ 20 августа 2009

Я работаю над приложением для управления активными каталогами. В дополнение к обычному созданию нового пользователя, включению / отключению учетной записи, сбросу моего пароля и т. Д. Он также управляет разрешениями приложений для всех клиентских веб-приложений. Управление приложениями осуществляется тысячами групп AD, например, из трехбуквенных кодов для приложения, раздела и сайта. Существуют также сотни групп AD, которые определяют, для каких приложений и местоположений координатор может предоставить права. Все эти группы, в свою очередь, принадлежат другим группам, поэтому я обычно фильтрую список групп с помощью свойства MemberOf, чтобы найти группы, к которым непосредственно принадлежит пользователь (или у каждого есть права на все). Я широко использовал пространство имен System.DirectoryServices.AccountManagment, используя метод FindByIdentity в 31 месте приложения. Этот метод вызывает закрытый метод FindPrincipalByIdentRefHelper для внутреннего класса ADStoreCtx. SearchResultCollection создается, но не удаляется, поэтому в конечном итоге, как правило, один или два раза в день веб-серверу не хватает памяти, и все приложения на веб-сервере перестают отвечать до тех пор, пока iis не будет сброшен, поскольку ресурсы, используемые объектами com, никогда не передаются .

Есть места, где я обращаюсь к базовым объектам каталогов, но во многих местах я использую свойства в Принципале - это значительное улучшение по сравнению с использованием эзотерических имен свойств объявлений в .Net 2.0 Directory код услуги.

Я связался с Microsoft по поводу этой проблемы, и она была исправлена ​​в .Net 4.0, но в настоящее время у них нет планов по ее исправлению в 3.5, если в сообществе нет интереса по этому поводу.

Я нашел информацию об этом только в нескольких местах

В документации MDSN в состоянии контента сообщества внизу есть утечка памяти (думаю, мне следовало прочитать это, прежде чем использовать метод)

http://msdn.microsoft.com/en-us/library/bb345628.aspx

И рассматриваемый класс является внутренним и не предоставляет SearchResultsCollection вне метода-нарушителя, поэтому я не могу получить результаты, чтобы удалить их или унаследовать от класса и переопределить метод.

Так что мои вопросы

Кто-нибудь еще сталкивался с этой проблемой? Если так, то смогли ли вы обойти это?

Есть ли у меня какая-либо опция, кроме переписывания приложения, не использующего какой-либо код активной директории .Net 3.5?

Спасибо

Ответы [ 2 ]

0 голосов
/ 22 июня 2012

Оберните ваши запросы к директории поиска внутри блока using, а также оберните коллекцию результатов внутри блока using и вызовите .Dispose () для результатов в явном виде. Смотрите ответ здесь:

Утечка памяти при использовании PrincipalSearcher.FindAll ()

0 голосов
/ 03 сентября 2009

Я столкнулся с той же ошибкой, и нет, у меня нет другого выхода, кроме как использовать подход DirectoryEntry.

...