Странное поведение в IIS 7.0 - System.DirectoryServices

Я столкнулся со странной проблемой в IIS 7.0:

У меня есть следующий виртуальный каталог в IIS:  alt text

и только режим проверки подлинности Windows включен для виртуального каталога в IIS

Теперь, если я попытаюсь получить связанный DirectoryEntry для TestV / Folder / file.aspx следующим образом:

string vDir = @"/TestV/folder/file.aspx";

            DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password");
            dir.AuthenticationType = AuthenticationTypes.Secure;

            try
            {
                Console.WriteLine(dir.Name);
            }
            catch (Exception exp)
            {
                Console.WriteLine(exp.Message);
            }

            Console.WriteLine("");

Получаю исключение: «Система не может найти указанный путь»

Теперь, если я вернусь в IIS, а затем выполню следующие шаги: щелкните правой кнопкой мыши TestV / Folder и включите режим анонимной проверки подлинности, а затем снова отключите его

Щелкните правой кнопкой мыши TestV / Folder / file.aspx и включите режим анонимной аутентификации, а затем снова отключите его

По сути, я просто выполнил ручной доступ к aspx-файлу Testv / Folder / file.aspx.

После вышеуказанных шагов, если я повторно запускаю программу, код успешно получает доступ к записи каталога и успешно печатает имя (file.aspx)

В чем проблема?

Еще одна информация:

Я также наблюдаю такое поведение в IIS 6.0. Таким образом, похоже, что до тех пор, пока я не выполню какую-либо ручную операцию в IIS для папки / файла в виртуальном каталоге, они не создадут соответствующие метаданные в активном каталоге?


person coder_bro    schedule 22.01.2009    source источник


Ответы (3)


Я получил ответ на проблему (с некоторой помощью одного из моих коллег)

Вот решение: 1. Программа должна добавить (псевдо?) Записи в метаданные IIS, прежде чем она получит доступ к файлу / папке в виртуальном каталоге, прежде чем мы получим доступ к записи:

try
            {
                // make pseudo entries:
                DirectoryEntry folder = rootDir.Children.Add("Folder", "IISWebDirectory");
                folder.CommitChanges();
                file = folder.Children.Add("File.aspx", "IISWebFile");
                file.CommitChanges();
            }

Тогда вуаля это работает

PS:

DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password");
dir.AuthenticationType = AuthenticationTypes.Secure;
dir.RefreshCache();

Directory.Refresh не помогает

person coder_bro    schedule 27.01.2009
comment
Вы можете использовать статический метод DirectoryEntry.Exists, чтобы узнать, существует ли запись. - person robertburke; 17.01.2013

Помогает ли вызов RefreshCache () сразу после третьей строки?

DirectoryEntry dir = new DirectoryEntry("IIS://" + serverName + "/W3SVC/1/ROOT" + vDir, @"adminusername", @"password");
dir.AuthenticationType = AuthenticationTypes.Secure;
dir.RefreshCache();
person Razzie    schedule 22.01.2009

Хотя это не совсем ответ, я бы отметил, что System.DirectoryServices обычно не используется для взаимодействия с IIS. Хотя он может предоставить вам доступ к настройкам IIS, WMI, как правило, является лучшим выбором.

person Steve Evans    schedule 22.01.2009