ActiveDirectory DirectorySearcher: почему FindOne() работает медленнее, чем FindAll(), и почему свойства опускаются?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 ActiveDirectory DirectorySearcher: почему FindOne() работает медленнее, чем FindAll(), и почему свойства опускаются?

Сообщение Anonymous »

У меня есть цикл, который извлекает некоторую информацию из ActiveDirectory. Это оказалось серьезным узким местом производительности.

Этот фрагмент (внутри цикла, который выполнялся 31 раз) занял 00:01:14.6562500 (1 минуту и ​​14 секунд). :

Код: Выделить всё

SearchResult data = searcher.FindOne();
System.Diagnostics.Trace.WriteLine(PropsDump(data));
Замена этого фрагмента привела к уменьшению значения до 00:00:03.1093750 (3 секунды):

Код: Выделить всё

searcher.SizeLimit = 1;
SearchResultCollection coll = searcher.FindAll();
foreach (SearchResult data in coll)
{
System.Diagnostics.Trace.WriteLine(PropsDump(data));
}
Результаты абсолютно идентичны, одни и те же свойства возвращаются в том же порядке. Я нашел некоторую информацию об утечках памяти в другой теме, но там не упоминалась производительность (я использую .Net 3.5).



На самом деле следующий вопрос представляет собой другой вопрос, но он дает некоторое представление о том, почему я вообще использую цикл:

Я хотел получить все свойства в один единственный запрос, но я не могу заставить DirectorySearcher вернуть все нужные свойства за один раз (он пропускает около 30% свойств, указанных в PropertiesToLoad (также пробовал установить его в конструкторе, но это не имеет значения), я обнаружил, что у кого-то другого было та же проблема, и это его решение (перебирать их). Когда я просматриваю их таким образом, используя FindOne() или FindAll(), я получаю все свойства, но на самом деле все это похоже на обходной путь.

Я что-то упустил?



Изменить:

Похоже, проблема заключалась в том, как я получил первую запись DirectoryEntry, для которой использовал DirectorySearcher.

Это было код, из-за которого DirectorySearcher возвращал только некоторые свойства:

Код: Выделить всё

private static DirectoryEntry GetEntry() {
DirectoryContext dc = new DirectoryContext(DirectoryContextType.DirectoryServer, "SERVERNAME", "USERNAME", "PASSWORD");
Forest forest = Forest.GetForest(dc);
DirectorySearcher searcher = forest.GlobalCatalogs[0].GetDirectorySearcher();

searcher.Filter = "OU=MyUnit";
searcher.CacheResults = true;
SearchResultCollection coll = searcher.FindAll();
foreach (SearchResult m in coll)
{
return m.GetDirectoryEntry();
}
throw new Exception("DirectoryEntry not found");
}
После замены этого длинного текста только этой строкой DirectorySearcher вернул все свойства, и цикл больше не нужен:

Код: Выделить всё

private static DirectoryEntry GetEntry2()
{
return new DirectoryEntry(@"LDAP://SERVERNAME/OU=MyUnit,DC=SERVERNAME,DC=local", "USERNAME", "PASSWORD");
}
Теперь для получения всех нужных свойств 31 записи требуется менее одной 18-й секунды.
Итак, кажется, что два разных экземпляра одного и того же DirectoryEntry может давать разные результаты в зависимости от способа его создания... немного жутковато!



Редактировать

Использовал JetBrains DotPeek, чтобы посмотреть на реализацию. Функция FindOne запускается следующим образом:

Код: Выделить всё

public SearchResult FindOne()
{
SearchResult searchResult1 = (SearchResult) null;
SearchResultCollection all = this.FindAll(false);
...
Моей первой реакцией было: «Ага!» неудивительно... но потом я заметил аргумент. У FindAll есть частная версия, которая принимает логическое значение. Это начало FindAll:

Код: Выделить всё

[TargetedPatchingOptOut("Performance critical to inline this type of method across NGen image boundaries")]
public SearchResultCollection FindAll()
{
return this.FindAll(true);
}

private SearchResultCollection FindAll(bool findMoreThanOne)
{
... // other code
this.SetSearchPreferences(adsSearch, findMoreThanOne);
Таким образом, это дает немного больше информации, но на самом деле мало что объясняет.

Подробнее здесь: https://stackoverflow.com/questions/185 ... all-and-wh
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Как обнаружить сбои доступа, когда DirectorySearcher.findall () (System.DirectoryServices nuget) молча пропускает OUS с
    Anonymous » » в форуме C#
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Как обнаружить сбои доступа, когда DirectorySearcher.findall () (System.DirectoryServices nuget) молча пропускает OUS с
    Anonymous » » в форуме C#
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Замена Microsoft.IdentityModel.Clients.ActiveDirectory на Microsoft.Identity.Client
    Anonymous » » в форуме C#
    0 Ответы
    28 Просмотры
    Последнее сообщение Anonymous
  • MongoDB User.findOne({email:email})
    Anonymous » » в форуме Jquery
    0 Ответы
    43 Просмотры
    Последнее сообщение Anonymous
  • Является ли GUID пользователя в ActiveDirectory нулевым?
    Anonymous » » в форуме C#
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»