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.
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
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:
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:
Przy dodawaniu wirtualnych katalogów należy pamiętać o kilku rzeczach:]}- Jak wspomniano, wirtualny
- 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.
path
jest zawsze relatywny do aplikacji nadrzędnej path
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:
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
:
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:
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:
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:
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:
Konwersja istniejącego folderu podrzędnego do aplikacji:
Jako ostateczny przykład chcemy przekształcić /other_apps/sub_app_1
w aplikację:
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:
Mam nadzieję, że pomoże to wyjaśnić związek między witrynami, aplikacjami i wirtualnymi katalogami.
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