Я использую 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:
Надеемся, что это поможет объяснить взаимосвязь между сайтами, приложениями и виртуальными каталогами.