Как отказаться от длительного поиска в System.DirectoryServices.Protocols

Я пытался решить, как отменить длительный поиск AD в System.DirectoryServices.Protocols. Кто-нибудь может помочь?

Я просмотрел атрибуты supportControl/supportedCapabilities в RootDSE, и они не содержат OID 1.3.6.1.1.8, поэтому я думаю, что это означает, что он не поддерживает расширенную операцию LDAP CANCEL, как определено здесь: http://tools.ietf.org/html/rfc3909

Остается исходная команда LDAP ABANDON (список см. здесь). Но похоже, что нет соответствующего Класс DirectoryRequest.

У кого-нибудь есть идеи?


person serialhobbyist    schedule 05.08.2009    source источник
comment
Я предлагаю награду за это: впервые я сделал это, поэтому не совсем уверен, что произойдет.   -  person serialhobbyist    schedule 12.08.2009


Ответы (3)


Я думаю, что нашел ответ: пока я читал ваше предложение, Мартин, я наткнулся на Abort в классе LdapConnection. Я не ожидал найти его там: начиная с документации LDAP, я ожидал найти его как просто еще одно сообщение LDAP, но ребята из MS, похоже, рассматривали его как особый случай. Если кто-нибудь знаком с реализацией LDAP, отличной от MS, и может прокомментировать, является ли подход MS типичным, я был бы признателен за улучшение моего понимания.

person serialhobbyist    schedule 15.08.2009

Я думаю, но я не уверен, что нет асинхронного запроса с отменой. У него есть асинхронное свойство, но оно позволяет заполнять коллекцию, ничего общего с отменой. Лучшее, что я могу предложить, — это поместить ваш запрос в фоновый рабочий поток и добавить асинхронный обратный вызов, который обработает ответ, когда он вернется. Если пользователь решит отменить, вы можете просто отменить фоновый рабочий поток. Вы освободите свое приложение, даже если вы не освободили сервер ldap до тех пор, пока он не завершит свой запрос. Информацию о потоках фоновых рабочих процессов можно найти по адресу http://www.c-sharpcorner.com/UploadFile/LivMic/BGWorker07032007000515AM/BGWorker.aspx Не забудьте вызвать .Dispose() при очистке объектов активного каталога, чтобы предотвратить утечку памяти.

person gjutras    schedule 13.08.2009
comment
Я не говорю о DirectorySearcher в System.DirectoryServices: я думаю, что вы. Я говорю о выполнении поиска с использованием System.DirectoryServices.Protocols. Как видно из ссылок, можно выполнять асинхронный поиск с помощью S.DS.P, поскольку он не использует ADSI, а использует собственный LDAP, а собственный LDAP имеет асинхронный поиск и возможность отмены. Я просто не могу найти это в документах. Я не хочу оставлять поиск запущенным из-за возможного влияния на сервер. - person serialhobbyist; 14.08.2009

Если запрос также выдаст много данных, вы можете отказаться от них с помощью пейджинга. Укажите PageResultRequestControl в запросе, что дает довольно небольшой размер страницы (IIUC, 1000 — размер страницы по умолчанию). IIUC, вы будете отправлять новые запросы каждый раз, когда получаете страницу (передавая файлы cookie из одного ответа в следующий запрос). Когда вы решите отменить запрос, отправьте другой запрос с нулевыми ожидаемыми результатами.

person Martin v. Löwis    schedule 14.08.2009