Korzystanie z ServerManager do tworzenia aplikacji w aplikacji

Używam ServerManager (Microsoft.Www.Administracja.dll) do tworzenia aplikacji w witrynie internetowej na IIS 7. Muszę utworzyć aplikację w tej aplikacji lub przekonwertować katalog wirtualny na aplikację (jak funkcja Menedżera usług iis kliknij prawym przyciskiem myszy - > Konwertuj na aplikację) Jak to możliwe? Znalazłem bardzo mało dokumentacji dotyczącej tej lib i żadna z nich nie odnosiła się do tej konkretnej funkcjonalności. Dzięki.

Author: Kev, 2010-12-23

1 answers

Sposobem na to jest manipulowanie kolekcją Site.Applications, która jest spłaszczonym drzewem wszystkich aplikacji w Twojej witrynie.

Ze względu na te przykłady przyjmiemy stronę o nazwie "MySite", gdzie zawartość znajduje się na lokalnym dysku twardym pod adresem: d:\mysite\www. Numer IIS witryny to 3, A witryna znajduje się we własnej puli aplikacji zwanej również "MySite".

Przyjmiemy również następującą strukturę folderów dla witryny

alt text

Na początek po otrzymaniu strony, do której chcemy dodać aplikację, użyjemy zmiennej site w całym tekście:

// Get my site
Site site = serverManager.Sites.First(s => s.Id == 3);

Aplikacja root"/":

Każda strona ma aplikację "root". Jeśli otworzymy applicationHost.config znajdujący się w %systemroot%\windows\system32\inetsrv\config i zlokalizujemy <site> węzeł dla naszej strony, zobaczymy co następuje:

<site name="MySite" id="3">
  <application path="/" applicationPool="MySite">
    <virtualDirectory path="/" physicalPath="d:\mysite\www" />
  </application>
</site>

Każda <site> zawiera zbiór <application>'s. zawsze będzie co najmniej jedna aplikacja, która definiuje aplikację root, /.

Atrybut applicationPool określa, której puli aplikacji użyć.

Zauważ, że istnieje pojedynczy element potomny: virtualDirectory.

Każdy application mA potomną kolekcję elementów virtualDirectory i zwykle w tej kolekcji będzie co najmniej jeden element.

Domyślne <virtualDirectory> w aplikacji root mówi nam:

  • this this is the root (path="/") and
  • że fizycznie znajduje się w systemie plików w d:\MySite\www (physicalPath="d:\MySite\www").

path każdego virtualDirectory jest względem path określonego w ścieżce rodzica application.

Dodawanie wirtualnego katalogu:

Gdybyśmy chcieli dodać wirtualny katalog do" katalogu głównego " mapowanego gdzie indziej na systemie plików, zrobilibyśmy:

Application rootApp = site.Applications.First(a => a.Path == "/");
rootApp.VirtualDirectories.Add("/vdir_1", @"D:\MySite\other_content");
serverManager.CommitChanges();

Konfiguracja wynikowa wygląda następująco:

<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>

I widzimy to w Menedżerze IIS:

alt text

Dodawanie katalogu wirtualnego do istniejącego katalogu wirtualnego:

Jeśli chcemy dodać wirtualny katalog dziecka do vdir1 zrobilibyśmy:

root.VirtualDirectories.Add("/vdir_1/sub_dir1", @"d:\MySite\more_content");

To daje:

<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 Manager:

alt text

Przy dodawaniu wirtualnych katalogów należy pamiętać o kilku rzeczach:]}
    Jak wspomniano, wirtualny path jest zawsze relatywny do aplikacji nadrzędnej path
  • ostatnia część Wirtualnego path np. /vdir_1 i .../sub_dir1 staje się nazwą wirtualnego katalogu
  • to całkowicie legalne mieć więcej niż jeden wirtualny katalog wskazuje na ten sam fizyczny folder
  • z wyjątkiem części nazw ścieżki katalogu wirtualnego, wszystkie części ścieżki powinny istnieć jako ścieżki fizyczne lub jako ścieżki wirtualne w katalogu głównym (d:\MySite\www). np. path powinno być w stanie nałożyć coś, co już tam jest, w przeciwnym razie wirtualny katalog nie będzie widoczny w Menedżerze usług IIS.

Jeśli chodzi o ostatni punkt, na przykład, nie mamy folderu fizycznego ani Wirtualnego katalog o nazwie /vdir_2, ale następujący kod jest całkowicie legalny:

root.VirtualDirectories.Add("/vdir_2/sub_dir1", @"d:\MySite\even_more_content");

Nie zobaczysz /vdir_2/sub_dir1 pojawi się w Menedżerze IIS, ale jest to legalne i możesz go przeglądać. Możemy to również zobaczyć w 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>

Konwertuj Folder na aplikację:

If you just uploaded an ASP.NET aplikacja do folderu /app_1 w Twojej witrynie i chcesz przekształcić go w własną aplikację robimy to:

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();    

W applicationHost.config widzimy nowy <application> element ma dodano:

<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>

W IIS widzimy:

alt text

Jest to odpowiednik kliknięcia prawym przyciskiem myszy "Konwertuj Na aplikację".

Dodaj aplikację do istniejącej aplikacji:

Dodanie aplikacji jako dziecka istniejącej aplikacji jest bardzo proste. Powiedzmy, że chcemy zrobić /app_1/sub_app_1 podzbiór /app_1:

alt text

Po prostu zrobimy:

Application app = 
  site.Applications.Add("/app_1/sub_app_1", @"d:\mysite\www\app_1\sub_app_1");
app.ApplicationPoolName ="MySite";

Wynikowa konfiguracja wyglądałaby like:

<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>

W IIS:

alt text

Dodaj wirtualny katalog do aplikacji:

Teraz, gdybyśmy chcieli dodać wirtualny katalog do tej aplikacji, zrobilibyśmy:

Application app = site.Applications.First(a => a.Path == "/app_1");
app.VirtualDirectories.Add("/vdir_1", @"d:\MySite\other_content");

W applicationHost.config widzimy nowy<virtualDirectory> element został dodany:

<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>

W IIS widzimy:

alt text

Ponownie należy zauważyć, że Ścieżka wirtualna /vdir1 jest zawsze względem ścieżki zawierającej podanie.

Konwertuj istniejący katalog wirtualny na aplikację:

A gdybyśmy chcieli przekonwertować utworzony właśnie wirtualny katalog (/app_1/vdir1) na aplikację? Musimy to zrobić w dwóch krokach:

// 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();    

WynikapplicationHost.config wygląda następująco:

<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>

W Menedżerze IIS widzimy:

alt text

Dodaj aplikację do istniejącego katalogu wirtualnego:

Co się stanie jeśli chcemy dodać aplikację do Wirtualnego Katalog, jak to działa? W tym przykładzie dodamy aplikację do utworzonego wcześniej katalogu wirtualnego /vdir_1/sub_dir1.

Application app = 
   site.Applications.Add("/vdir_1/sub_dir1/app_2", @"d:\mysite\other_content");
app.ApplicationPoolName = "MySite";
serverManager.CommitChanges();

Wynikowy config wygląda następująco:

<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>

I w Menedżerze IIS widzimy:

alt text

Konwersja istniejącego folderu podrzędnego do aplikacji:

Jako ostateczny przykład chcemy przekształcić /other_apps/sub_app_1 w aplikację:

alt text

Nasz kod wygląda następująco:

Application app = 
   site.Applications.Add("/other_apps/sub_app_1", @"d:\mysite\other_content");
app.ApplicationPoolName="MySite";
serverManager.CommitChanges();

Wynik 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>
  <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>

W Menedżerze IIS:

alt text

Mam nadzieję, że pomoże to wyjaśnić związek między witrynami, aplikacjami i wirtualnymi katalogami.

 97
Author: Kev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-13 20:54:36