Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: serialhobbyistОтветов: 3

Я пытался решить, как отменить длительный поиск 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.

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

  • Я предлагаю награду за это: впервые я сделал это, поэтому не совсем уверен, что произойдет. serialhobbyist 12.08.2009

searchactive-directorydirectoryservices

Ответы

Ответ 1 · рейтинг 1 · serialhobbyist

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

Ответ 2 · gjutras

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

Ответ 3 · Martin v. Löwis

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

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы