Tworzenie katalogów wirtualnych w usługach IIS Express

124

Czy istnieje sposób na utworzenie katalogu wirtualnego w usługach IIS Express? Wiem, że Cassini nie może tego zrobić i byłoby miło móc to zrobić bez korzystania z pełnej wersji IIS.

Mam to tak daleko, że mogę przeglądać moją aplikację lokalnie w IIS Express w następujący sposób:

http: // localhost: 1132 /

Chciałbym utworzyć katalog wirtualny o nazwie „OffSiteStuff” i wskazać go w jakimś miejscu na moim dysku C, na przykład „c: \ offsitestuff”, a następnie przeglądać elementy w tym folderze w następujący sposób:

http: // localhost: 1132 / OffSiteStuff / UserUploadedImage.jpg

Wiem, że mógłbym to zrobić z folderem w mojej witrynie i nadal używać IIS Express lub, jeśli o to chodzi, zwykłego starego Cassini, ale ten folder będzie przechowywać obrazy przesłane przez użytkowników i naprawdę nie chcę, aby te obrazy były pomieszane z pliki aplikacji.

Innym rozwiązaniem typu „idź na całość” jest wdrożenie witryny w pełnowymiarowej instancji Server 2008 IIS 7.5 za każdym razem, gdy chcę debugować funkcje korzystające z zawartości zewnętrznej, ale jest to również trochę kłopotliwe.

Czy jest jakiś sposób mogę to zrobić w <System.WebServer />elemencie konfiguracji sieci Web?

John Hoge
źródło
5
W przypadku programu Visual Studio 2015 działał mikedice417.wordpress.com/2015/09/13/… . applicationHost.configPlik jest w katalogu głównym projektu: ${PROJECT}\.vs\config\applicationHost.config.
Matt
Tutaj jest odpowiedź, która może ci pomóc: https://stackoverflow.com/a/46260607/2472664
Giovanny Farto M.

Odpowiedzi:

129

Konfiguracją ekspresową usług IIS zarządza plik applicationhost.config.
Możesz go znaleźć w

Users \ <nazwa użytkownika> \ Documents \ IISExpress \ config.

Wewnątrz można znaleźć sekcję witryn, w której znajdują się sekcje dla każdej witryny skonfigurowanej w usługach IIS Express.

Dodaj (lub zmodyfikuj) sekcję witryny, taką jak ta:

<site name="WebSiteWithVirtualDirectory" id="20">
   <application path="/" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="c:\temp\website1" />
   </application>
   <application path="/OffSiteStuff" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="d:\temp\SubFolderApp" />
   </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:1132:localhost" />
   </bindings>
</site>

Praktycznie musisz dodać nowy tag aplikacji w swojej witrynie dla każdego katalogu wirtualnego. Otrzymujesz dużą elastyczność, ponieważ możesz ustawić inną konfigurację katalogu wirtualnego (na przykład inną wersję .Net Framework)

EDYTUJ Podziękowania dla Fevzi Apaydın za wskazanie bardziej eleganckiego rozwiązania.

Możesz osiągnąć ten sam wynik, dodając jeden lub więcej tagów virtualDirectory do tagu aplikacji:

<site name="WebSiteWithVirtualDirectory" id="20">
   <application path="/" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="c:\temp\website1" />
     <virtualDirectory path="/OffSiteStuff" physicalPath="d:\temp\SubFolderApp" />
   </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:1132:localhost" />
   </bindings>
</site>

Odniesienie:

Najlepsza.
źródło
Po dodaniu każdego znacznika aplikacji do każdego katalogu wirtualnego nie mogłem uruchomić aplikacji „offsitestuff”. Np .: iisexpress / site: WebSiteWithVirtualDirectory - uruchom pierwszą aplikację ze ścieżki „C: \ temp \ website1”. Jak uruchomić drugą aplikację, która zawiera ścieżkę „d: \ temp \ SubFolderApp”
Velu,
W sekcji powiązań zobaczysz adres URL i port używane do uzyskania dostępu do katalogu głównego Twojej witryny. A więc: localhost: 1132 to adres URL aplikacji internetowej zainstalowanej w c: \ temp \ website1 localhost: 1132 / OffSiteStuff to adres URL aplikacji internetowej zainstalowanej w d: \ temp \ SubFolderApp.
Be.St.
Czy ktoś wie, czy / jak mogę skonfigurować ustawienia osobno dla każdego projektu (więc mogę sprawdzić w konfiguracji)? Dzięki
Ian Grainger
1
@Najlepsza. Chciałbym, żeby numer portu dla witryny IIS był taki sam dla wszystkich deweloperów - więc chciałbym sprawdzić (niektóre) konfigurację w. Ale nie mogę tego zrobić z jego bieżącej lokalizacji. Zastanawiałem się, czy mógłbym wskazać inny plik w stylu UserAppSettings itp.
Ian Grainger
26
Uwaga: chociaż te instrukcje nadal dotyczą programu Visual Studio 2015, lokalizacja applicationhost.configuległa zmianie. Bardziej sensownie niż poprzednie wersje, znajduje się teraz w .vs\configpodfolderze folderu rozwiązania.
Richard Moss
91

Podejście @ Be.St. Jest prawdziwe, ale niekompletne. Po prostu kopiuję jego wyjaśnienie, poprawiając niewłaściwą część.

Konfiguracją ekspresową usług IIS zarządza plik applicationhost.config.
Możesz go znaleźć w

Users \ <nazwa użytkownika> \ Documents \ IISExpress \ config.

Wewnątrz można znaleźć sekcję witryn, w której znajdują się sekcje dla każdej witryny skonfigurowanej w usługach IIS Express.

Dodaj (lub zmodyfikuj) sekcję witryny, taką jak ta:

<site name="WebSiteWithVirtualDirectory" id="20">
   <application path="/" applicationPool="Clr4IntegratedAppPool">
     <virtualDirectory path="/" physicalPath="c:\temp\website1" />
     <virtualDirectory path="/OffSiteStuff" physicalPath="d:\temp\SubFolderApp" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="*:1132:localhost" />
   </bindings>
</site>

Zamiast dodawać nowy blok aplikacji, powinieneś po prostu dodać nowy element virtualDirectory do elementu nadrzędnego aplikacji.

Edycja - Visual Studio 2015

Jeśli szukasz pliku applicationHost.config i używasz VS2015, znajdziesz go w:

[katalog_rozwiązania] /. vs / config / applicationHost.config

Fevzi Apaydın
źródło
4
Czy mimo to można to zastosować w projekcie programu Visual Studio? W środowisku wielu programistów, jeśli ktoś inny sprawdzi kod na swoim komputerze, jego lokalny IIS Express nie będzie skonfigurowany z katalogiem wirtualnym i nie spowoduje błędów w czasie wykonywania, prawda?
ahillier88
4
W programie Visual Studio 2015 plik konfiguracyjny usług IIS jest przechowywany w katalogu rozwiązania w folderze o nazwie .vs / config, dzięki czemu można go sprawdzić w kontroli źródła, jeśli chcesz.
Randy Gamage,
Tak wiele braków odpowiedzi zalewa wyniki Google na to pytanie w odniesieniu do VS 2012. To działa !!!!
Tim Ogilvy
Czy można dodać oddzielną aplikację do katalogu wirtualnego w IIS Express, aby mieć dwie aplikacje w jednej domenie?
Denys Alexieiev
6

W VS2013 zrobiłem to w następujących krokach:

1. Kliknij prawym przyciskiem projekt aplikacji internetowej i naciśnij Właściwości

2. Wyświetl kartę „Sieć” na stronie Właściwości

3. W obszarze Serwery, przy czym domyślnym wyborem z listy rozwijanej jest „IIS Express”, w polu „Adres URL projektu” zmień adres URL, używając numeru portu na taki, który Ci odpowiada. Na przykład usunąłem numer portu i dodałem "/ MVCDemo4" po localhost.

4. Kliknij przycisk „Utwórz katalog wirtualny”.

5. Uruchom swój projekt, a zostanie użyty nowy adres URL

user2765861
źródło
1
Nie pozwala to na skonfigurowanie ścieżki fizycznej.
Victorio Berra
2

Jeśli używasz programu Visual Studio 2013 (może wymagać wersji Pro lub nowszej), udało mi się dodać katalog wirtualny do witryny internetowej IIS Express (opartej na plikach), klikając prawym przyciskiem myszy witrynę w Eksploratorze rozwiązań i klikając Dodaj> Nowy katalog wirtualny. Spowoduje to dodanie wpisu do pliku applicationhost.config, podobnie jak w przypadku metod ręcznych opisanych tutaj.

Bryan B.
źródło
0

Miałem coś innego, same pliki były niedostępne w środowisku SBS.

Usuń pliki z folderu konfiguracyjnego (jeśli nie możesz ich otworzyć!) I zastąp je kopią folderu na swoim lokalnym komputerze.

Naprawiłem to dla mnie :)

NicoJuicy
źródło
Pliki w folderze Users \ <nazwa użytkownika> \ Documents \ IISExpress \ config są chronione dla każdego użytkownika. Być może próbowałeś go edytować z innym użytkownikiem. Aby go edytować, musisz uruchomić Notatnik (lub edytor) w trybie administracyjnym. W ten sposób możesz go zmodyfikować. Lub usuń i skopiuj tak, jak zrobiłeś :-)
Be.St.
0

Musiałem dokonać wpisu w pliku [projekt] .vs \ config \ applicationhost.config.

Wcześniej działał od wdrożenia, ale nie z kodu.

TheJoe
źródło
0

W odpowiedzi na dalsze pytanie -

„Czy w ogóle istnieje możliwość zastosowania tego w projekcie Visual Studio? W środowisku wielu programistów, jeśli ktoś inny sprawdzi kod na swojej maszynie, jego lokalny IIS Express nie będzie skonfigurowany z katalogiem wirtualnym i spowoduje błędy w czasie wykonywania. prawda? "

Nigdy nie znalazłem spójnej odpowiedzi na to nigdzie, ale potem doszedłem do wniosku, że możesz to zrobić za pomocą zdarzenia po kompilacji, używając zadania XmlPoke w pliku projektu witryny -

<Target Name="AfterBuild">
    <!-- Get the local directory root (and strip off the website name) -->
    <PropertyGroup>
        <LocalTarget>$(ProjectDir.Replace('MyWebSite\', ''))</LocalTarget>
    </PropertyGroup>

    <!-- Now change the virtual directories as you need to -->
    <XmlPoke XmlInputPath="..\..\Source\Assemblies\MyWebSite\.vs\MyWebSite\config\applicationhost.config" 
        Value="$(LocalTarget)AnotherVirtual" 
        Query="/configuration/system.applicationHost/sites/site[@name='MyWebSite']/application[@path='/']/virtualDirectory[@path='/AnotherVirtual']/@physicalPath"/>
</Target>

Możesz użyć tej techniki, aby ponownie przypisać wszystko w pliku przed uruchomieniem IISExpress. Pozwoliłoby to początkowo wymusić plik applicationHost.config w GIT (zakładając, że jest on ignorowany przez gitignore), a następnie ponownie przypisać wszystkie ścieżki w czasie kompilacji. GIT zignoruje wszelkie zmiany w pliku, więc można je teraz łatwo udostępniać.

W odpowiedzi na kolejne pytanie dotyczące dodawania innych aplikacji w ramach jednej witryny:

Możesz utworzyć witrynę w pliku hostów aplikacji, tak jak na serwerze. Na przykład:

  <site name="MyWebSite" id="2">
    <application path="/" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\GIT\MyWebSite\Main" />
      <virtualDirectory path="/SharedContent" physicalPath="C:\GIT\SharedContent" />
      <virtualDirectory path="/ServerResources" physicalPath="C:\GIT\ServerResources" />
    </application>
    <application path="/AppSubSite" applicationPool="Clr4IntegratedAppPool">
      <virtualDirectory path="/" physicalPath="C:\GIT\AppSubSite\" />
      <virtualDirectory path="/SharedContent" physicalPath="C:\GIT\SharedContent" />
      <virtualDirectory path="/ServerResources" physicalPath="C:\GIT\ServerResources" />
    </application>
    <bindings>
      <binding protocol="http" bindingInformation="*:4076:localhost" />
    </bindings>
  </site>

Następnie użyj powyższej techniki, aby zmienić lokalizacje folderów w czasie kompilacji.

AngryDaz
źródło
Czy można dodać oddzielną aplikację do katalogu wirtualnego w IIS Express, aby mieć dwie aplikacje w jednej domenie?
Denys Alexieiev