Подтвердить что ты не робот

Использование ServerManager для создания приложения в приложении

Я использую ServerManager (Microsoft.Web.Administration.dll) для создания приложения на веб-сайте IIS 7. Мне нужно создать приложение в этом приложении или преобразовать виртуальный каталог в приложение (например, функция диспетчера iis правой кнопкой мыши → конвертировать в приложение) Как это можно сделать? Я нашел очень мало документации относительно этой библиотеки, и ни одна из них не ссылалась на эту конкретную функциональность. Спасибо.

4b9b3361

Ответ 1

Способ сделать это - манипулировать коллекцией Site.Applications, которая является сглаженным деревом всех приложений на вашем сайте.

Для этих примеров мы возьмем сайт под названием "MySite", где содержимое находится на локальном жестком диске: d:\mysite\www. Номер сайта IIS 3, и сайт находится в собственном пуле приложений, также называемом "MySite".

Мы также предположим следующую структуру папок для сайта

alt text

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

alt text

Добавление виртуального каталога в существующий виртуальный каталог:

Если бы мы хотели добавить дочерний виртуальный каталог в 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:

alt text

При добавлении виртуальных каталогов нужно иметь в виду пару вещей:

  • Как уже упоминалось, виртуальный 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 мы видим:

alt text

Это эквивалентно щелчку правой кнопкой мыши "Преобразовать в приложение".

Добавить приложение в существующее приложение:

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

alt text

Мы просто сделали бы:

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:

alt text

Добавить виртуальный каталог в приложение:

Теперь, если бы мы хотели добавить виртуальный каталог в это приложение, мы сделаем следующее:

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 мы видим:

alt text

Снова важно отметить, что виртуальный путь /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 мы видим:

alt text

Добавить приложение в существующий виртуальный каталог:

Что произойдет, если мы хотим добавить приложение в виртуальный каталог, как это работает? В этом примере мы добавим приложение в виртуальный каталог /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 мы видим:

alt text

Преобразовать существующую дочернюю папку в приложение:

В качестве окончательного примера мы хотим превратить /other_apps/sub_app_1 в приложение:

alt text

Наш код выглядит так:

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:

alt text

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