Criando diretórios virtuais no IIS Express

124

Existe alguma maneira de criar um diretório virtual no IIS Express? Eu sei que a Cassini não pode fazer isso e seria bom poder fazer isso sem usar uma versão completa do IIS.

Compreendi até agora que posso navegar para o meu aplicativo localmente no IIS Express assim:

http: // localhost: 1132 /

O que eu gostaria de fazer é criar um diretório virtual chamado "OffSiteStuff" e apontá-lo para algum local na minha unidade C, como "c: \ offsitestuff" e, em seguida, procurar itens nessa pasta como este:

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

Eu sei que eu poderia fazer isso com uma pasta no meu site e ainda usar o IIS Express, ou, na verdade, o velho Cassini, mas essa pasta armazenará imagens enviadas por usuários e eu realmente não quero misturar essas imagens com arquivos de aplicativo.

A outra solução, "vá em frente" é implantar o site em uma instância completa do Server 2008 IIS 7.5 toda vez que eu desejar depurar os recursos que usam conteúdo externo, mas isso também é um pouco complicado.

Existe alguma maneira de fazer isso no <System.WebServer />elemento de configuração da Web?

John Hoge
fonte
5
Para o Visual Studio 2015, mikedice417.wordpress.com/2015/09/13/… funcionou. O applicationHost.configarquivo está na raiz do projeto: ${PROJECT}\.vs\config\applicationHost.config.
Matt
Aqui há uma resposta que poderia ajudá-lo: https://stackoverflow.com/a/46260607/2472664
Giovanny Farto M.

Respostas:

129

A configuração expressa do IIS é gerenciada por applicationhost.config.
Você pode encontrá-lo em

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

Dentro, você pode encontrar a seção de sites que contém uma seção para cada site configurado do IIS Express.

Adicione (ou modifique) uma seção de site como esta:

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

Praticamente você precisa adicionar uma nova tag de aplicativo no seu site para cada diretório virtual. Você tem muita flexibilidade porque pode definir configurações diferentes para o diretório virtual (por exemplo, uma versão diferente do .Net Framework)

EDIT Agradecemos a Fevzi Apaydın por apontar para uma solução mais elegante.

Você pode obter o mesmo resultado adicionando uma ou mais tags virtualDirectory à tag 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>

Referência:

Melhor.
fonte
Depois de adicionar cada tag de aplicativo para cada diretório virtual, não consegui executar o aplicativo "offsitestuff". Ex: iisexpress / site: WebSiteWithVirtualDirectory - execute o primeiro aplicativo no caminho "C: \ temp \ website1". Como posso executar o meu segundo aplicativo que contém o caminho "d: \ temp \ SubFolderApp"
Velu
Na seção de ligações, você vê o URL e a porta usados ​​para acessar a raiz do seu site. Portanto, localhost: 1132 é o URL do aplicativo Web instalado em c: \ temp \ website1 localhost: 1132 / OffSiteStuff é o URL do aplicativo Web instalado em d: \ temp \ SubFolderApp.
Be.St.
Alguém sabe se / como posso definir as configurações separadamente para cada projeto (para que eu possa verificar a configuração)? Obrigado
Ian Grainger
1
@Melhor. Gostaria que coisas como o número da porta de um site IIS fossem iguais para todos os desenvolvedores - por isso, gostaria de verificar (algumas) as configurações. Mas não posso fazer isso a partir da localização atual. Queria saber se eu poderia apontar para outro arquivo no estilo de UserAppSettings etc.
Ian Grainger
26
Nota: Embora essas instruções ainda se apliquem ao Visual Studio 2015, o local applicationhost.configfoi alterado. Mais sensatamente que as versões anteriores, agora está localizado na .vs\configsubpasta da sua pasta de soluções.
Richard Moss
91

A abordagem de @ Be.St. É verdadeira, mas incompleta. Só estou copiando a explicação dele para corrigir a parte incorreta.

A configuração expressa do IIS é gerenciada por applicationhost.config.
Você pode encontrá-lo em

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

Dentro, você pode encontrar a seção de sites que contém uma seção para cada site configurado do IIS Express.

Adicione (ou modifique) uma seção de site como esta:

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

Em vez de adicionar um novo bloco de aplicativo, você deve adicionar um novo elemento virtualDirectory ao elemento pai do aplicativo.

Editar - Visual Studio 2015

Se você estiver procurando pelo arquivo applicationHost.config e estiver usando o VS2015, encontrará:

[diretório da solução] /. vs / config / applicationHost.config

Fevzi Apaydın
fonte
4
Existe alguma maneira de aplicar isso dentro do projeto Visual Studio? Em um ambiente com vários desenvolvedores, se alguém verificar o código em sua máquina, o IIS Express local não seria configurado com o diretório virtual e causaria erros de tempo de execução, não?
precisa saber é o seguinte
4
No Visual Studio 2015, o arquivo de configuração do IIS é armazenado no diretório da solução, em uma pasta chamada .vs / config, para que você possa verificá-lo no controle de origem, se desejar.
precisa
Tantas não respostas inundam os resultados do google para esta pergunta em relação ao VS 2012. Isso funciona !!!!
Tim Ogilvy
É possível adicionar um aplicativo separado ao diretório virtual no IIS Express para que eu possa ter dois aplicativos em um domínio?
Denys Alexieiev
6

No VS2013, fiz isso nas seguintes etapas:

1.Clique com o botão direito do mouse no projeto de aplicativo da web e clique em Propriedades

2.Ver a guia "Web" da página Propriedades

3.Em Servidores, com "IIS Express" como a opção padrão da lista suspensa, no "URL do Projeto" altere a URL usando o número da porta para aquele que mais lhe convier. Por exemplo, apaguei o número da porta e adicionei "/ MVCDemo4" após o host local.

4.Clique no botão "Criar diretório virtual".

5. Execute seu projeto e o novo URL será usado

user2765861
fonte
1
Isso não permite que você configure o caminho físico.
Victorio Berra
2

Se você estiver usando o Visual Studio 2013 (pode exigir a edição Pro ou superior), consegui adicionar um diretório virtual a um site do IIS Express (baseado em arquivo) clicando com o botão direito do mouse no site do Gerenciador de Soluções e clicando em Adicionar> Novo diretório virtual. Isso adicionou uma entrada ao arquivo applicationhost.config, como nos métodos manuais descritos aqui.

Bryan B
fonte
0

Eu tinha outra coisa: os arquivos em si eram inacessíveis em um ambiente do SBS.

Exclua os arquivos na pasta de configuração (se não conseguir abri-los!) E substitua-os por uma cópia da pasta no seu próprio PC local.

Corrigido para mim :)

NicoJuicy
fonte
Os arquivos em Users \ <username> \ Documents \ IISExpress \ config são protegidos por usuário. Talvez você tenha tentado editá-lo com um usuário diferente. Portanto, para editá-lo, você precisa executar o Bloco de Notas (ou seu editor) no modo Administração. Dessa forma, você pode modificá-lo. Ou exclua e copie como você fez :-)
Be.St.
0

Eu tive que fazer a entrada no arquivo [projeto] .vs \ config \ applicationhost.config.

Antes disso, ele trabalhava na implantação, mas não no código.

TheJoe
fonte
0

Em resposta à outra pergunta -

"existe alguma maneira de aplicar isso no projeto Visual Studio? Em um ambiente de vários desenvolvedores, se alguém verificar o código em sua máquina, o IIS Express local não seria configurado com o diretório virtual e causaria erros de tempo de execução. não é? "

Nunca encontrei uma resposta consistente para isso em nenhum lugar, mas descobri que você poderia fazer isso com um evento pós-compilação usando a tarefa XmlPoke no arquivo de projeto do site -

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

Você pode usar essa técnica para apontar qualquer coisa no arquivo antes do IISExpress iniciar. Isso permitiria forçar inicialmente um arquivo applicationHost.config para o GIT (supondo que ele seja ignorado pelo gitignore) e, posteriormente, apontar todos os caminhos no momento da criação. O GIT ignorará quaisquer alterações no arquivo, agora é fácil compartilhá-las.

Em resposta à outra pergunta sobre como adicionar outros aplicativos em um site:

Você pode criar o site no arquivo de hosts do aplicativo, exatamente como o do seu servidor. Por exemplo:

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

Em seguida, use a técnica acima para alterar os locais da pasta no momento da criação.

AngryDaz
fonte
É possível adicionar um aplicativo separado ao diretório virtual no IIS Express para que eu possa ter dois aplicativos em um domínio?
Denys Alexieiev