Я пытался решить, как отменить длительный поиск 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.
У кого-нибудь есть идеи?
Ответ 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 из одного ответа в следующий запрос). Когда вы решите отменить запрос, отправьте другой запрос с нулевыми ожидаемыми результатами.