Création de répertoires virtuels dans IIS express

124

Existe-t-il un moyen de créer un répertoire virtuel dans IIS express? Je sais que Cassini ne peut pas faire cela et ce serait bien de pouvoir le faire sans utiliser une version complète d'IIS.

Je l'ai si loin que je peux accéder à mon application localement dans IIS express comme ceci:

http: // localhost: 1132 /

Ce que je voudrais faire, c'est créer un répertoire virtuel appelé "OffSiteStuff" et le pointer vers un emplacement sur mon lecteur C, comme "c: \ offsitestuff", puis parcourir les éléments de ce dossier comme ceci:

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

Je sais que je pourrais le faire avec un dossier sur mon site et toujours utiliser IIS Express, ou, d'ailleurs, le vieux Cassini, mais ce dossier stockera les images téléchargées par les utilisateurs et je ne veux vraiment pas que ces images soient mélangées avec fichiers d'application.

L'autre solution, «go big», consiste à déployer le site sur une instance Server 2008 IIS 7.5 à part entière chaque fois que je veux déboguer les fonctionnalités qui utilisent du contenu hors site, mais c'est aussi un peu compliqué.

Est-il possible de faire cela dans l' <System.WebServer />élément de configuration Web?

John Hoge
la source
5
Pour Visual Studio 2015, mikedice417.wordpress.com/2015/09/13/… a fonctionné. Le applicationHost.configfichier est sous la racine du projet: ${PROJECT}\.vs\config\applicationHost.config.
Matt
Voici une réponse qui pourrait vous aider: https://stackoverflow.com/a/46260607/2472664
Giovanny Farto M.

Réponses:

129

La configuration IIS express est gérée par applicationhost.config.
Vous pouvez le trouver dans

Dossier Users \ <username> \ Documents \ IISExpress \ config.

À l'intérieur, vous pouvez trouver la section des sites qui contient une section pour chaque site configuré par IIS Express.

Ajoutez (ou modifiez) une section de site comme celle-ci:

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

En pratique, vous devez ajouter une nouvelle balise d'application dans votre site pour chaque répertoire virtuel. Vous bénéficiez d'une grande flexibilité car vous pouvez définir une configuration différente pour le répertoire virtuel (par exemple une version différente de .Net Framework)

EDIT Merci à Fevzi Apaydın pour pointer vers une solution plus élégante.

Vous pouvez obtenir le même résultat en ajoutant une ou plusieurs balises virtualDirectory à la balise Application:

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

Référence:

Meilleur.
la source
Après avoir ajouté chaque étiquette d'application pour chaque répertoire virtuel, je n'ai pas pu exécuter l'application "offsitestuff". Ex: iisexpress / site: WebSiteWithVirtualDirectory - exécutez la première application à partir du chemin "C: \ temp \ website1". Comment puis-je exécuter ma 2ème application contenant le chemin "d: \ temp \ SubFolderApp"
Velu
Dans la section des liaisons, vous voyez l'url et le port utilisés pour accéder à la racine de votre site. Donc: localhost: 1132 est l'url de l'application Web installée dans c: \ temp \ website1 localhost: 1132 / OffSiteStuff est l'url de l'application Web installée dans d: \ temp \ SubFolderApp.
Be.St.
Quelqu'un sait si / comment je peux configurer les paramètres séparément pour chaque projet (afin que je puisse vérifier la configuration)? Merci
Ian Grainger
1
@Meilleur. J'aimerais que le numéro de port d'un site IIS soit le même pour tous les développeurs - j'aimerais donc vérifier (une partie) de la configuration. Mais je ne peux pas faire cela à partir de son emplacement actuel. Je me demandais si je pouvais le pointer vers un autre fichier dans le style de UserAppSettings, etc.
Ian Grainger
26
Remarque: Bien que ces instructions s'appliquent toujours à Visual Studio 2015, l'emplacement de applicationhost.configa changé. Plus judicieusement que les versions précédentes, il se trouve désormais dans le .vs\configsous-dossier de votre dossier de solution.
Richard Moss
91

L'approche de @ Be.St.est vraie, mais incomplète. Je copie simplement son explication en corrigeant la partie incorrecte.

La configuration IIS express est gérée par applicationhost.config.
Vous pouvez le trouver dans

Dossier Users \ <username> \ Documents \ IISExpress \ config.

À l'intérieur, vous pouvez trouver la section des sites qui contient une section pour chaque site configuré par IIS Express.

Ajoutez (ou modifiez) une section de site comme celle-ci:

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

Au lieu d'ajouter un nouveau bloc d'application, vous devez simplement ajouter un nouvel élément virtualDirectory à l'élément parent de l'application.

Modifier - Visual Studio 2015

Si vous recherchez le fichier applicationHost.config et que vous utilisez VS2015, vous le trouverez dans:

[répertoire_solution] /. vs / config / applicationHost.config

Fevzi Apaydın
la source
4
Est-il possible d'appliquer cela dans le projet Visual Studio? Dans un environnement multi-développeur, si quelqu'un d'autre vérifie le code sur sa machine, alors son IIS Express local ne sera pas configuré avec le répertoire virtuel et provoquera des erreurs d'exécution, n'est-ce pas?
ahillier88
4
Dans Visual Studio 2015, le fichier de configuration IIS est stocké dans le répertoire de la solution, dans un dossier appelé .vs / config, afin que vous puissiez l'archiver dans le contrôle de code source si vous le souhaitez.
Randy Gamage du
Tant de non-réponses inondent les résultats de google pour cette question par rapport à VS 2012. Cela fonctionne !!!!
Tim Ogilvy
Est-il possible d'ajouter une application distincte au répertoire virtuel dans IIS express afin que je puisse avoir deux applications sous un même domaine?
Denys Alexieiev le
6

Dans VS2013, je l'ai fait dans les étapes suivantes:

1.Cliquez avec le bouton droit sur le projet d'application Web et appuyez sur Propriétés

2.Affichez l'onglet "Web" de la page Propriétés

3.Sous les serveurs, avec "IIS Express" étant le choix par défaut de la liste déroulante, dans la "URL du projet", changez l'url en utilisant le numéro de port pour celui qui vous convient. Par exemple, j'ai supprimé le numéro de port et ajouté "/ MVCDemo4" après l'hôte local.

4.Cliquez sur le bouton "Créer un répertoire virtuel".

5.Exécutez votre projet et la nouvelle URL sera utilisée

user2765861
la source
1
Cela ne vous permet pas de configurer le chemin physique.
Victorio Berra
2

Si vous utilisez Visual Studio 2013 (peut nécessiter une édition Pro ou une version ultérieure), j'ai pu ajouter un répertoire virtuel à un site Web IIS Express (basé sur un fichier) en cliquant avec le bouton droit sur le site Web dans l'Explorateur de solutions et en cliquant sur Ajouter> Nouveau répertoire virtuel. Cela a ajouté une entrée au fichier applicationhost.config comme avec les méthodes manuelles décrites ici.

Bryan B
la source
0

J'avais autre chose, les fichiers eux-mêmes étaient inaccessibles dans un environnement SBS.

Supprimez les fichiers du dossier de configuration (si vous ne pouvez pas les ouvrir!) Et remplacez-les par une copie du dossier sur votre propre ordinateur local.

Correction de ça pour moi :)

NicoJuicy
la source
Les fichiers dans Users \ <username> \ Documents \ IISExpress \ config sont protégés par utilisateur. Vous avez peut-être essayé de le modifier avec un autre utilisateur. Donc, pour le modifier, vous devez exécuter le Bloc-notes (ou votre éditeur) en mode Administration. De cette façon, vous pouvez le modifier. Ou supprimez et copiez comme vous l'avez fait :-)
Be.St.
0

J'ai dû faire l'entrée dans le fichier [project] .vs \ config \ applicationhost.config.

Avant cela, cela fonctionnait à partir du déploiement, mais pas à partir du code.

TheJoe
la source
0

En réponse à la question complémentaire -

"est-il possible de l'appliquer dans le projet Visual Studio? Dans un environnement multi-développeur, si quelqu'un d'autre vérifie le code sur sa machine, alors son IIS Express local ne sera pas configuré avec le répertoire virtuel et entraînera des erreurs d'exécution n'est-ce pas? "

Je n'ai jamais trouvé de réponse cohérente à cela nulle part, mais j'ai ensuite compris que vous pouviez le faire avec un événement post build en utilisant la tâche XmlPoke dans le fichier de projet du site Web -

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

Vous pouvez utiliser cette technique pour rediriger n'importe quoi dans le fichier avant le démarrage d'IISExpress. Cela vous permettrait de forcer initialement un fichier applicationHost.config dans GIT (en supposant qu'il soit ignoré par gitignore), puis de rediriger tous les chemins au moment de la construction. GIT ignorera toutes les modifications apportées au fichier, il est donc désormais facile de les partager.

En réponse à la question supplémentaire sur l'ajout d'autres applications sous un même site:

Vous pouvez créer le site dans le fichier d'hôtes de votre application comme celui de votre serveur. Par exemple:

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

Utilisez ensuite la technique ci-dessus pour modifier les emplacements des dossiers au moment de la génération.

AngryDaz
la source
Est-il possible d'ajouter une application distincte au répertoire virtuel dans IIS express afin que je puisse avoir deux applications sous un même domaine?
Denys Alexieiev le