Книга: C# для профессионалов. Том II

Пределы поиска

Пределы поиска

Такой поиск может охватывать несколько доменов. Чтобы ограничить поиск некоторым числом объектов или требуемым временем, необходимо определить несколько дополнительных свойств.

Свойства DirectorySearcher Описание
ClientTimeout Максимальное время, в течение которого клиент ожидает, что сервер вернет результат. Если сервер не отвечает, то никаких записей не возвращается.
PageSize При постраничном поиске сервер возвращает число объектов, определенных с помощью PageSize, а не весь результат. Это сокращает и время клиента для получения первого ответа, и необходимую память. Сервер посылает клиенту cookie, которое отправляется назад на сервер с запросом следующего поиска, чтобы поиск можно было продолжить в точке, где он закончился.
ServerPageTimeLimit Это значение определяет время для постраничного поиска, чтобы вернуть число объектов, которое определено значением PageSize. Если время истекает до достижения значения PageSize, найденные до этого момента объекты возвращаются клиенту. Значение по умолчанию равно -1, что означает бесконечность.
ServerTimeLimit Определяет максимальное время, в течение которого сервер будет искать объекты. Когда это время истекает, все найденные до этого момента объекты возвращаются клиенту. По умолчанию используется 120 секунд, и нельзя задать время поиска больше этого значения.
ReferalChasing Поиск может распространяться на несколько доменов. Если корень, который определен в SearchRoot, является родительским доменом или корень не был определен, поиск может распространиться на домены-потомки. С помощью этого свойства можно определить, что поиск должен продолжаться на других серверах. ReferalChasingOption.None означает, что поиск не продолжается на другие серверы. С помощью значения ReferalChasingOption.Subordinate можно определить, что поиск должен переходить на домены-потомки. Когда поиск начинается в DC=Wrox, DC=COM, сервер возвращает множество результатов и ссылку на DC=France, DC=Wrox, DC=COM. Клиент может продолжить поиск в поддомене. ReferalChasingOption.External означает, что сервер может направить клиента на независимый сервер, которого нет в поддомене. Это вариант поведения по умолчанию. Для ReferalChasingOption.All возвращаются ссылки на внешние домены и подчиненные домены.

В рассматриваемом примере поиска мы хотим найти все объекты пользователей в организационной единице Wrox Press, где свойство description содержит значение Author.

Сначала мы соединяемся с организационной единицей Wrox Press. Здесь начинается поиск. Создадим объект DirectorySearcher, где задан SearchRoot. Фильтр определяется как (&(objectClass=user)(description=Auth*)) для того, чтобы мы нашли все объекты типа user, где свойство description начинается с последовательности Auth, за которой может следовать что-то еще. Область поиска должна быть поддеревом, чтобы поиск происходил в порождаемых организационных единицах для Wrox Press:

DirectoryEntry de new DirectoryEntry();
de.Path = "LDAP://OU=Wrox Press, " + "DC=eichkogelstrasse, DC=local";
DirectorySearcher searcher = new DirectorySearcher();
searcher.SearchRoot  = de;
searcher.Filter = "(&(objectClass=user)(description=Auth*))";
searcher.SearchScope = SearchScope.Subtree;

В результате поиска мы хотим получить свойства name, description, givenName, и wWWHomePage.

searcher.PropertiesToLoad.Add("name");
searcher.PropertiesToLoad.Add("description");
searcher. PropertiesToLoad.Add("givenName");
searcher.PropertiesToLoad.Add("wWWHomePage");

Мы готовы начать поиск. Однако, результат необходимо отсортировать. DirectorySearcher имеет свойство Sort, где можно задать SortOption. Первый аргумент конструктора SortOption определяет свойство, по которому будет проводиться сортировка, второй аргумент определяет направление сортировки. Перечисление SortDirection имеет значения Ascending и Descending.

Чтобы начать поиск, можно использовать метод FindOne() для нахождения первого объекта или FindAll(), чтобы найти все объекты. FindOne() вернет простой SearchResult, FindAll() вернет SearchResultCollection. Мы хотим получить всех авторов, поэтому используем FindAll():

searcher.Sort = new SortOption("givenName", SortDirection.Ascending);
SearchResultCollection Results = searcher.FindAll();

С помощью цикла foreach мы получаем доступ ко всем SearchResult в SearchResultCollection. SearchResult представляет один объект в кэше поиска. Свойство Properties возвращает ResultPropertyCollection, где мы получаем доступ ко всем свойствам и значениям по имени свойства и по индексу.

SearchResultCollection results = Searcher.FindAll();
 foreach (SearchResult result in results) {
  ResutPropertyCollection props = result.Properties;
  foreach (string propName in props.PropertyNames) {
   Console.Write(propName + ": ");
   Console.WriteLine(props[propName][0]);
  }
  Console.WriteLine();
 }
}

Если необходимо получить весь объект после поиска, то это также возможна. SearchResult имеет метод GetDirectoryEntry(), который возвращает соответствующую запись DirectoryEntry найденного объекта.

Результирующий вывод показывает начале списка всех авторов книги Professional C# с выбранными свойствами


Оглавление книги


Генерация: 0.388. Запросов К БД/Cache: 0 / 0
поделиться
Вверх Вниз