Я использую ServerManager (Microsoft.Web.Administration.dll) для создания приложения на веб-сайте IIS 7. Мне нужно создать приложение в этом приложении или преобразовать виртуальный каталог в приложение (например, функция диспетчера iis правой кнопкой мыши → конвертировать в приложение) Как это можно сделать? Я нашел очень мало документации относительно этой библиотеки, и ни одна из них не ссылалась на эту конкретную функциональность. Спасибо.
Использование ServerManager для создания приложения в приложении
Ответ 1
Способ сделать это - манипулировать коллекцией Site.Applications, которая является сглаженным деревом всех приложений на вашем сайте.
Для этих примеров мы возьмем сайт под названием "MySite", где содержимое находится на локальном жестком диске: d:\mysite\www. Номер сайта IIS 3, и сайт находится в собственном пуле приложений, также называемом "MySite".
Мы также предположим следующую структуру папок для сайта

Для начала мы добавим сайт, на который хотим добавить приложение, мы будем использовать переменную site:
// Get my site
Site site = serverManager.Sites.First(s => s.Id == 3);
Корневое приложение "/":
Каждый сайт имеет "корневое" приложение. Если мы откроем applicationHost.config, расположенный в %systemroot%\windows\system32\inetsrv\config, и найдите <site> node для нашего сайта, мы увидим следующее:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\www" />
</application>
</site>
Каждый <site> содержит коллекцию <application>. Всегда будет по крайней мере одно приложение, которое определяет корневое приложение, /.
Атрибут applicationPool указывает, какой пул приложений использовать.
Обратите внимание, что существует единственный дочерний элемент: virtualDirectory.
Каждый application имеет дочерний набор элементов virtualDirectory, и в этой коллекции обычно будет хотя бы один элемент.
По умолчанию <virtualDirectory> в корневом приложении сообщает нам:
- это это корень (
path="/") и - что он физически находится в файловой системе в
d:\mysite\www(physicalPath="d:\MySite\www").
path каждого virtualDirectory относится к path, указанному в родительском пути application.
Добавление виртуального каталога:
Если бы мы хотели добавить виртуальный каталог к "корню сайта", сопоставленному где-то еще в файловой системе, мы бы сделали:
Application rootApp = site.Applications.First(a => a.Path == "/");
rootApp.VirtualDirectories.Add("/vdir_1", @"D:\MySite\other_content");
serverManager.CommitChanges();
Результирующая конфигурация выглядит следующим образом:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
</application>
</site>
И мы видим это в диспетчере IIS:

Добавление виртуального каталога в существующий виртуальный каталог:
Если бы мы хотели добавить дочерний виртуальный каталог в vdir1, мы бы сделали:
root.VirtualDirectories.Add("/vdir_1/sub_dir1", @"d:\MySite\more_content");
это приводит к:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
</application>
</site>
Менеджер IIS:

При добавлении виртуальных каталогов нужно иметь в виду пару вещей:
- Как уже упоминалось, виртуальный
pathвсегда относится к родительскому приложениюpath - Последняя часть виртуального
path, например./vdir_1и.../sub_dir1становится именем виртуального каталога - Совершенно законно иметь более одного виртуального каталога в одной физической папке
- За исключением части имени пути к виртуальному каталогу, все части пути должны существовать либо как физические пути, либо как виртуальные пути в корне сайта (
d:\mysite\www). то естьpathдолжен иметь возможность перекрывать то, что уже существует, иначе виртуальный каталог не будет отображаться в диспетчере IIS.
Что касается последней точки, например, у нас нет физической папки или виртуального каталога с именем /vdir_2, но следующий код совершенно легален:
root.VirtualDirectories.Add("/vdir_2/sub_dir1", @"d:\MySite\even_more_content");
Вы не увидите /vdir_2/sub_dir1 в диспетчере IIS, но это законно, и вы можете на самом деле перейти к нему. Мы также можем видеть это в applicationHost.config:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
</site>
Конвертировать папку в приложение:
Если вы просто загрузили приложение ASP.NET в папку /app_1 на своем сайте и хотите превратить его в свое приложение, мы делаем следующее:
Application app = site.Applications.Add("/app_1", @"d:\MySite\www\app_1");
// set application pool, otherwise it'll run in DefaultAppPool
app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();
В applicationHost.config мы увидим новый элемент <application>:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
</site>
В IIS мы видим:

Это эквивалентно щелчку правой кнопкой мыши "Преобразовать в приложение".
Добавить приложение в существующее приложение:
Добавление приложения в качестве дочернего элемента существующего приложения очень простое. Предположим, что мы хотим сделать /app_1/sub_app_1 вспомогательное приложение /app_1:

Мы просто сделали бы:
Application app =
site.Applications.Add("/app_1/sub_app_1", @"d:\mysite\www\app_1\sub_app_1");
app.ApplicationPoolName ="MySite";
Результирующая конфигурация будет выглядеть так:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/sub_app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\www\app_1\sub_app_1" />
</application>
</site>
В IIS:

Добавить виртуальный каталог в приложение:
Теперь, если бы мы хотели добавить виртуальный каталог в это приложение, мы сделаем следующее:
Application app = site.Applications.First(a => a.Path == "/app_1");
app.VirtualDirectories.Add("/vdir_1", @"d:\MySite\other_content");
В applicationHost.config мы увидим новый элемент <virtualDirectory>:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
<virtualDirectory path="/vdir_1" physicalPath="d:\MySite\other_content" />
</application>
</site>
В IIS мы видим:

Снова важно отметить, что виртуальный путь /vdir1 всегда относится к пути содержащего приложения.
Преобразование существующего виртуального каталога в приложение:
Что делать, если мы хотим конвертировать только что созданный виртуальный каталог (/app_1/vdir1) в приложение? Мы должны сделать это в два этапа:
// Get the application
Application app_1 = site.Applications.First(a => a.Path == "/app_1");
// Find the virtual directory
VirtualDirectory vdir_1 = app_1.VirtualDirectories.First(v => v.Path == "/vdir_1");
// Remove it from app_1
app_1.VirtualDirectories.Remove(vdir_1);
// Create our application
Application vdir_1_app = site.Applications.Add("/app_1/vdir_1", vdir_1.PhysicalPath);
// set application pool, otherwise it'll run in DefaultAppPool
vdir_1_app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();
Результат applicationHost.config выглядит следующим образом:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/vdir_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
</application>
</site>
В диспетчере IIS мы видим:

Добавить приложение в существующий виртуальный каталог:
Что произойдет, если мы хотим добавить приложение в виртуальный каталог, как это работает? В этом примере мы добавим приложение в виртуальный каталог /vdir_1/sub_dir1, который мы создали ранее.
Application app =
site.Applications.Add("/vdir_1/sub_dir1/app_2", @"d:\mysite\other_content");
app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();
Результирующая конфигурация выглядит так:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/vdir_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
</application>
<application path="/vdir_1/sub_dir1/app_2" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
</application>
</site>
В менеджере IIS мы видим:

Преобразовать существующую дочернюю папку в приложение:
В качестве окончательного примера мы хотим превратить /other_apps/sub_app_1 в приложение:

Наш код выглядит так:
Application app =
site.Applications.Add("/other_apps/sub_app_1", @"d:\mysite\other_content");
app.ApplicationPoolName="MySite";
serverManager.CommitChanges();
Результирующая конфигурация:
<site name="MySite" id="3">
<application path="/" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="D:\MySite\www" />
<virtualDirectory path="/vdir_1" physicalPath="D:\MySite\other_content" />
<virtualDirectory path="/vdir_1/sub_dir1" physicalPath="D:\MySite\more_content" />
<virtualDirectory path="/vdir_2/sub_dir1" physicalPath="D:\MySite\even_more_content" />
</application>
<application path="/app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\www\app_1" />
</application>
<application path="/app_1/vdir_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\MySite\other_content" />
</application>
<application path="/vdir_1/sub_dir1/app_2" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
</application>
<application path="/other_apps/sub_app_1" applicationPool="MySite">
<virtualDirectory path="/" physicalPath="d:\mysite\other_content" />
</application>
</site>
В диспетчере IIS:

Надеемся, что это поможет объяснить взаимосвязь между сайтами, приложениями и виртуальными каталогами.