Попытка создать «Виртуальный каталог» создает вместо этого «Виртуальное приложение» - PullRequest
1 голос
/ 27 января 2012

У меня есть веб-приложение, которое развертывается с двумя виртуальными каталогами под его виртуальным приложением IIS. В блоках IIS 6 следующий код создает эти виртуальные каталоги, как и ожидалось, однако в блоках IIS 7 я получаю виртуальное приложение с двумя другими виртуальными приложениями, а не одно виртуальное приложение с двумя виртуальными каталогами под ним. Я попробовал следующие два метода, но оба по-прежнему создают виртуальное приложение, а не виртуальный каталог. Как изменить этот код для развертывания необходимых виртуальных каталогов, а не нежелательных виртуальных приложений?

один

private void AddVirtualDir(DirectoryEntry entry)
{
    DirectoryEntry virtualDirectory = (DirectoryEntry)entry.Invoke("Create", "IIsWebVirtualDir", "VirtualDirectory");
    virtualDirectory.InvokeSet("Path", @"VirtualPath");
    virtualDirectory.InvokeSet("AppFriendlyName", "VirtualDirectory");
    virtualDirectory.Properties["AccessRead"][0] = true;
    virtualDirectory.Properties["AccessScript"][0] = 512;
    virtualDirectory.Properties["AppIsolated"].Clear();
    virtualDirectory.Properties["AppIsolated"].Add(2);
    virtualDirectory.Invoke("AppCreate", false);
    virtualDirectory.CommitChanges();
    entry.CommitChanges();
}

два:

private void AddVirtualDir(DirectoryEntry entry)
{
    var virtualDirectory = entry.Children.Add("VirtualDirectory", "IIsWebVirtualDir");
    virtualDirectory.Properties["AccessRead"][0] = true;
    virtualDirectory.Properties["AccessScript"][0] = 512;
    virtualDirectory.Properties["AppFriendlyName"][0] = "EditorControls";
    virtualDirectory.Properties["AppIsolated"][0] = 2;
    virtualDirectory.Properties["Path"][0] = Path.Combine(_INSTALLDIR, @"Kryptiq_Root\FormManagement\EditorControls");
    virtualDirectory.CommitChanges();
    entry.CommitChanges();
}

1 Ответ

2 голосов
/ 27 января 2012

Как это работает на IIS6

Проблема здесь в том, что вы устанавливаете значение AppIsolated.В IIS6 это используется для настройки того, как должно работать приложение, и обычно вам никогда не нужно касаться этого или добавлять его где-либо.

AppIsolated всегда по умолчанию 2, что означает объединенный процесс, т. Е. Приложение будет выполняться либо в пуле приложений родительского приложения, либо в пуле, указанном AppPoolId.

Причина, по которой существуют другие значения, заключается в том, что вы можете настроить приложение для запуска в нескольких устаревших режимах IIS5 - в режиме «В процессе» и «Вне процесса».

Так что, если вы не настроили свой сайт *Если приложение 1017 * работает как-либо иначе, чем AppIsolated="2", тогда вам не нужно устанавливать это значение.

Ваш код может быть простым:

using (var entry = new DirectoryEntry("IIS://localhost/W3SVC/1/ROOT"))
{
  using (DirectoryEntry virtualDirectory = entry.Children.Add("MyVdir", 
                                           "IIsWebVirtualDir"))
  {
    virtualDirectory.Properties["Path"][0] = PATH_TO_MY_STUFF;
    virtualDirectory.Properties["AccessRead"][0] = true;
    virtualDirectory.Properties["AccessScript"][0] = 512;
    virtualDirectory.CommitChanges();
  }
}

Если вы установитеAppIsolated в IIS6 это игнорируется, потому что для того, чтобы каталог стал приложением, вам также необходимо установить AppRoot.

IIS7 - совместимость с IIS6

в IIS7при использовании System.DirectoryServices вы работаете с базовым API совместимости II6, который переводит эти вызовы ADSI в вызовы нового API IIS7.Это не идеально, и я подозреваю, что когда он видит, что AppIsolated установлен, он предполагает, что вы хотите приложение, несмотря на то, что вы не указываете никаких других значений метабазы, связанных с приложением.

Управляемый IIS7 API лучше

Вы, вероятно, знаете это, но лучше работать с конфигурацией IIS7 через управляемые Microsoft.Web.Administration биты.Не все параметры совместимости ADSI / метабазы ​​имеют эквиваленты в IIS7, что может заставить уровень перевода идти на компромиссы, чтобы обойти это.Я упоминаю эти типы проблем в своих ответах здесь и здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...