| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Refresh DirectoryServices cache |
| Автор: mihryak 2.1.2010, 00:39 | ||||||||
| С Новым Годом, коллеги! В приложении необходимо устанавливать IIS (шестой, но это роли не играет), чтобы затем, используя Active Directory, довести его до рабочего состояния. При этом, в том же приложении также активно используется AD, причём, как до установки IIS'а, так и после. Теперь к сути проблемы: настройка IIS'a в общих чертах заключается в получении DirectoryEntry нужного сайта и некоторых операциях с ним, для простоты можно ограничиться лишь получением:
но вся штука заключается в том, что до этого вызова я уже обращался к AD, к примеру, так:
этот код, по всей видимости, поднимает, инициализирует и кэширует всех имеющихся на момент инициализации поставщиков данных (LDAP, IIS, etc.), но IIS'а на момент этой инициализации ещё нет в системе, и первый код получения сайта благополучно вываливается с типичным COM-исключением на любом свойстве-методе DirectoryEntry, как будто её не удалось найти т.е. так не работает
, а так работает
И не важно, программно ли ставится IIS, или через компоненты системы, всё равно ошибка одна и та же, при этом второе такое же приложение, запущенное уже после установки, работает на ура Т.е. проблема именно в кэшировании. И, собственно, вопрос: можно ли как-нибудь принудительно переинициализировать кэш или всю сборку System.DirectoryServices? У DirectoryEntry есть метод RefreshCache(), но он, собака такая, работает только с живой Entry, а у меня она уже мертворождённая. Пробовал вынести получение и работу с сайтом в отдельный AppDomain, надеясь, что там будет заново проходить поднятие AD, но результат тот же. Ещё пробовал найти рефлектором эту инициализацию в сборке - не нашёл, но ведь она где-то там должна быть.. Ну и последней надеждой было воспользоваться исходниками фреймворка, любезно предоставленными MS, но DirectoryServices, увы, не вошла в представленный список. Может какие-нибудь свежие идеи найдутся? |
| Автор: mihryak 4.1.2010, 00:26 | ||
| всё оказалось на порядок унылее, чем я надеялся поковырявшись в рефлекторе, удалось редуцировать код до такого:
как и прежде, после рестарта приложения всё работает т.е. проблема кэширования находится не во фреймворке, а в unmanaged коде - если этот интеропный метод вызывался до установкии ииса, то его провайдер до конца жизни приложения будет недоступен мсдн http://msdn.microsoft.com/en-us/library/aa772238%28VS.85%29.aspx, что этот метод - обёртка над комовым объектом, может, это как-то поможет решить мерзопакостную проблему? |
| Автор: mihryak 6.1.2010, 00:48 | ||
последние известия
точно так же не работает дот.нет реабилитирован, тему помечаю закрытой создал http://forum.vingrad.ru/forum/topic-286326/kw-adsi-iis-activedirectory.html в плюсовом разделе (осторожно, рекурсия! |