Compartilhar via


Diretório virtual <virtualDirectory>

Visão geral

O elemento <virtualDirectory> é filho do elemento <application> e controla as configurações de um diretório virtual específico. Um diretório virtual é um nome de diretório (também conhecido como caminho) que você especifica no IIS (Serviços de Informações da Internet) 7 e mapeia para um diretório físico em um servidor local ou remoto. O nome do diretório virtual se torna parte da URL do aplicativo e os usuários podem solicitar a URL de um navegador para acessar o conteúdo no diretório físico, como uma página da Web ou uma lista de diretórios e arquivos adicionais. Se você especificar um nome diferente do diretório físico para o diretório virtual, será mais difícil para os usuários descobrirem a estrutura de arquivo físico real em seu servidor porque a URL não é mapeada diretamente para a raiz do site.

No IIS 7, cada aplicativo deve ter um diretório virtual, conhecido como diretório virtual raiz e mapeia o aplicativo para o diretório físico que contém o conteúdo do aplicativo. No entanto, um aplicativo pode ter mais de um diretório virtual. Por exemplo, você pode usar um diretório virtual quando quiser que seu aplicativo inclua imagens de outro local no sistema de arquivos, mas não deseja mover os arquivos de imagem para o diretório físico mapeado para o diretório virtual raiz do aplicativo.

Compatibilidade

Versão Observações
IIS 10.0 O elemento <virtualDirectory> não foi modificado no IIS 10.0.
IIS 8.5 O elemento <virtualDirectory> não foi modificado no IIS 8.5.
IIS 8.0 O elemento <virtualDirectory> não foi modificado no IIS 8.0.
IIS 7.5 O elemento <virtualDirectory> não foi modificado no IIS 7.5.
IIS 7.0 O elemento <virtualDirectory> foi introduzido no IIS 7.0.
IIS 6,0 O elemento <virtualDirectory> substitui os objetos de metabase IIsWebVirtualDir e IIsWebDirectory do IIS 6.0.

Instalação

O elemento <virtualDirectory> está incluído na instalação padrão do IIS 7.

Instruções

Como criar um novo diretório virtual.

  1. Abra o Gerenciador dos Serviços de Informações da Internet (IIS):

    • Caso você esteja usando o Windows Server 2012 ou o Windows Server 2012 R2:

      • Na barra de tarefas, clique em Gerenciador do Servidor, em Ferramentas e em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows 8 ou Windows 8.1:

      • Mantenha pressionada a tecla Windows, pressione a letra X e clique em Painel de Controle.
      • Clique em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Caso você esteja usando o Windows Server 2008 ou o Windows Server 2008 R2:

      • Na barra de tarefas, clique em Iniciar, vá para Ferramentas Administrativas e clique em Gerenciador dos Serviços de Informações da Internet (IIS).
    • Se você estiver usando o Windows Vista ou Windows 7:

      • Na barra de tarefas, clique em Iniciar e, depois, em Painel de Controle.
      • Clique duas vezes em Ferramentas Administrativas e clique duas vezes em Gerenciador dos Serviços de Informações da Internet (IIS).
  2. No painel Conexões, expanda o nome do servidor, Sites, o site ao qual deseja adicionar o diretório virtual e, em seguida, clique no aplicativo ao qual deseja adicionar o diretório virtual.
    Screenshot that shows the My Application Home pane.

  3. No painel Ações, clique em Exibir Diretórios Virtuais e, em seguida, clique em Adicionar Diretório Virtual...

  4. Na caixa de diálogo Adicionar Diretório Virtual, insira, no mínim,o informações nas caixas de texto Alias: e Caminho físico: e, em seguida, clique em OK.
    Screenshot that shows the Add Virtual Directory dialog box.

    Observação

    Você pode clicar em Conectar como... para configurar o servidor para usar as credenciais especificadas quando ele acessar o conteúdo no diretório virtual e clicar em Configurações de Teste... para testar as configurações de autenticação e autorização do diretório virtual.

Configuração

O elemento <virtualDirectory> pode ser configurado no nível do servidor, do site e do aplicativo no arquivo ApplicationHost.config.

Atributos

Atributo Descrição
allowSubDirConfig Atributo booliano opcional.

Especifica se o IIS procura arquivos web.config em diretórios de conteúdo inferiores ao nível atual (True) ou não procura arquivos web.config em diretórios de conteúdo inferiores ao nível atual (False).

O valor padrão é true.
logonMethod Atributo de enumeração opcional.

Especifica o método de logon para o diretório virtual.

O atributo logonMethod pode ser um dos valores possíveis a seguir. O padrão é ClearText.
Valor Descrição
Batch Esse tipo de logon é destinado a servidores em lote, onde os processos podem ser executados em nome de um usuário sem a intervenção direta dele.

O valor numérico é 1.
ClearText Esse tipo de logon preserva o nome e a senha no pacote de autenticação, o que permite que o servidor faça conexões com outros servidores de rede enquanto representa o cliente.

O valor numérico é 3.
Interactive Esse tipo de logon é destinado a usuários que usarão interativamente o computador.

O valor numérico é 0.
Network Esse tipo de logon é destinado a servidores de alto desempenho na autenticação de senhas em texto não criptografado. As credenciais não são armazenadas em cache para esse tipo de logon.

O valor numérico é 2.
password Atributo de cadeia de caracteres opcional.

Especifica a senha associada ao nome de usuário.

Observação: para evitar o armazenamento de cadeias de caracteres de senha não criptografadas em arquivos de configuração, use sempre AppCmd.exe ou o gerenciador do IIS para inserir senhas. Se você usar essas ferramentas de gerenciamento, as cadeias de caracteres de senha serão criptografadas automaticamente antes de serem gravadas nos arquivos de configuração XML. Isso fornece melhor segurança de senha do que armazenar senhas não criptografadas.
path Atributo de cadeia de caracteres opcional.

Especifica o caminho virtual do diretório virtual.
physicalPath Atributo de cadeia de caracteres opcional.

Especifica o caminho físico do diretório virtual.
userName Atributo de cadeia de caracteres opcional.

Especifica o nome de usuário de uma conta que pode acessar arquivos de configuração e conteúdo para esse diretório virtual.

Elementos filho

Nenhum.

Exemplo de configuração

O exemplo de configuração a seguir exibe um elemento <site> que contém dois aplicativos. O primeiro elemento <application> define o aplicativo raiz para o site, juntamente com o diretório virtual raiz do aplicativo. O segundo elemento <application> contém as configurações de um aplicativo CRM no site. O atributo path define o caminho para o aplicativo. Esse elemento <application> contém dois elementos <virtualDirectory>. O primeiro define o diretório virtual raiz do aplicativo e o segundo define um diretório virtual de imagens para o aplicativo.

<site name="Contoso" id="2" serverAutoStart="true">
   <application path="/">
      <virtualDirectory path="/" physicalPath="C:\Contoso\Content" />
   </application>
   <application path="/CRM">
      <virtualDirectory path="/" physicalPath="C:\Contoso\Content\CRM" />
      <virtualDirectory path="/Images" physicalPath="E:\Images" />
   </application>
   <bindings>
      <binding protocol="http" bindingInformation="*:80:www.contoso.com" />
   </bindings>
</site>

Exemplo de código

Os exemplos a seguir criam um novo aplicativo chamado ShoppingCart com uma raiz de diretório virtual de C:\Inetpub\Contoso\ShoppingCart para um site chamado Contoso.

Observação

Ao criar um aplicativo a partir do prompt de comando ou de um script, você deve criar explicitamente um diretório virtual raiz para o aplicativo.

AppCmd.exe

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].[path='/ShoppingCart']" /commit:apphost

appcmd.exe set config -section:system.applicationHost/sites /+"[name='Contoso'].[path='/ShoppingCart'].[path='/',physicalPath='C:\Inetpub\Contoso\ShoppingCart']" /commit:apphost

Observação

Defina o parâmetro commit para apphost quando usar AppCmd.exe para definir essas configurações. Isso confirma as definições de configuração para a seção de local apropriado no arquivo ApplicationHost.config.

C#

using System;
using System.Text;
using Microsoft.Web.Administration;

internal static class Sample
{
   private static void Main()
   {
      using (ServerManager serverManager = new ServerManager())
      {
         Configuration config = serverManager.GetApplicationHostConfiguration();
         ConfigurationSection sitesSection = config.GetSection("system.applicationHost/sites");
         ConfigurationElementCollection sitesCollection = sitesSection.GetCollection();
         ConfigurationElement siteElement = FindElement(sitesCollection, "site", "name", @"Contoso");

         if (siteElement == null) throw new InvalidOperationException("Element not found!");

         ConfigurationElementCollection siteCollection = siteElement.GetCollection();
         ConfigurationElement applicationElement = siteCollection.CreateElement("application");

         applicationElement["path"] = @"/ShoppingCart";
         ConfigurationElementCollection applicationCollection = applicationElement.GetCollection();
         ConfigurationElement virtualDirectoryElement = applicationCollection.CreateElement("virtualDirectory");
         virtualDirectoryElement["path"] = @"/";
         virtualDirectoryElement["physicalPath"] = @"C:\Inetpub\Contoso\ShoppingCart";
         applicationCollection.Add(virtualDirectoryElement);
         siteCollection.Add(applicationElement);

         serverManager.CommitChanges();
      }
   }

   private static ConfigurationElement FindElement(ConfigurationElementCollection collection, string elementTagName, params string[] keyValues)
   {
      foreach (ConfigurationElement element in collection)
      {
         if (String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase))
         {
            bool matches = true;
            for (int i = 0; i < keyValues.Length; i += 2)
            {
               object o = element.GetAttributeValue(keyValues[i]);
               string value = null;
               if (o != null)
               {
                  value = o.ToString();
               }
               if (!String.Equals(value, keyValues[i + 1], StringComparison.OrdinalIgnoreCase))
               {
                  matches = false;
                  break;
               }
            }
            if (matches)
            {
               return element;
            }
         }
      }
      return null;
   }
}

VB.NET

Imports System
Imports System.Text
Imports Microsoft.Web.Administration

Module Sample
   Sub Main()
      Dim serverManager As ServerManager = New ServerManager
      Dim config As Configuration = serverManager.GetApplicationHostConfiguration
      Dim sitesSection As ConfigurationSection = config.GetSection("system.applicationHost/sites")
      Dim sitesCollection As ConfigurationElementCollection = sitesSection.GetCollection
      Dim siteElement As ConfigurationElement = FindElement(sitesCollection, "site", "name", "Contoso")

      If (siteElement Is Nothing) Then
         Throw New InvalidOperationException("Element not found!")
      End If

      Dim siteCollection As ConfigurationElementCollection = siteElement.GetCollection
      Dim applicationElement As ConfigurationElement = siteCollection.CreateElement("application")
      applicationElement("path") = "/ShoppingCart"
      Dim applicationCollection As ConfigurationElementCollection = applicationElement.GetCollection
      Dim virtualDirectoryElement As ConfigurationElement = applicationCollection.CreateElement("virtualDirectory")
      virtualDirectoryElement("path") = "/"
      virtualDirectoryElement("physicalPath") = "C:\Inetpub\Contoso\ShoppingCart"
      applicationCollection.Add(virtualDirectoryElement)
      siteCollection.Add(applicationElement)

      serverManager.CommitChanges()
   End Sub

   Private Function FindElement(ByVal collection As ConfigurationElementCollection, ByVal elementTagName As String, ByVal ParamArray keyValues() As String) As ConfigurationElement
      For Each element As ConfigurationElement In collection
         If String.Equals(element.ElementTagName, elementTagName, StringComparison.OrdinalIgnoreCase) Then
            Dim matches As Boolean = True
            Dim i As Integer
            For i = 0 To keyValues.Length - 1 Step 2
               Dim o As Object = element.GetAttributeValue(keyValues(i))
               Dim value As String = Nothing
               If (Not (o) Is Nothing) Then
                  value = o.ToString
               End If
               If Not String.Equals(value, keyValues((i + 1)), StringComparison.OrdinalIgnoreCase) Then
                  matches = False
                  Exit For
               End If
            Next
            If matches Then
               Return element
            End If
         End If
      Next
      Return Nothing
   End Function


End Module

JavaScript

var adminManager = new ActiveXObject('Microsoft.ApplicationHost.WritableAdminManager');
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST";
var sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST");
var sitesCollection = sitesSection.Collection;
var siteElementPos = FindElement(sitesCollection, "site", ["name", "Contoso"]);

if (siteElementPos == -1) throw "Element not found!";

var siteElement = sitesCollection.Item(siteElementPos);
var siteCollection = siteElement.Collection;
var applicationElement = siteCollection.CreateNewElement("application");
applicationElement.Properties.Item("path").Value = "/ShoppingCart";
var applicationCollection = applicationElement.Collection;
var virtualDirectoryElement = applicationCollection.CreateNewElement("virtualDirectory");
virtualDirectoryElement.Properties.Item("path").Value = "/";
virtualDirectoryElement.Properties.Item("physicalPath").Value = "C:\\Inetpub\\Contoso\\ShoppingCart";
applicationCollection.AddElement(virtualDirectoryElement);
siteCollection.AddElement(applicationElement);

adminManager.CommitChanges();

function FindElement(collection, elementTagName, valuesToMatch) {
   for (var i = 0; i < collection.Count; i++) {
      var element = collection.Item(i);
      if (element.Name == elementTagName) {
         var matches = true;
         for (var iVal = 0; iVal < valuesToMatch.length; iVal += 2) {
            var property = element.GetPropertyByName(valuesToMatch[iVal]);
            var value = property.Value;
            if (value != null) {
               value = value.toString();
            }
            if (value != valuesToMatch[iVal + 1]) {
               matches = false;
               break;
            }
         }
         if (matches) {
            return i;
         }
      }
   }
   return -1;
}

VBScript

Set adminManager = CreateObject("Microsoft.ApplicationHost.WritableAdminManager")
adminManager.CommitPath = "MACHINE/WEBROOT/APPHOST"
Set sitesSection = adminManager.GetAdminSection("system.applicationHost/sites", "MACHINE/WEBROOT/APPHOST")
Set sitesCollection = sitesSection.Collection
siteElementPos = FindElement(sitesCollection, "site", Array("name", "Contoso"))

If (siteElementPos = -1) Then
   WScript.Echo "Element not found!"
   WScript.Quit
End If

Set siteElement = sitesCollection.Item(siteElementPos)
Set siteCollection = siteElement.Collection
Set applicationElement = siteCollection.CreateNewElement("application")
applicationElement.Properties.Item("path").Value = "/ShoppingCart"
Set applicationCollection = applicationElement.Collection
Set virtualDirectoryElement = applicationCollection.CreateNewElement("virtualDirectory")
virtualDirectoryElement.Properties.Item("path").Value = "/"
virtualDirectoryElement.Properties.Item("physicalPath").Value = "C:\Inetpub\Contoso\ShoppingCart"
applicationCollection.AddElement(virtualDirectoryElement)
siteCollection.AddElement(applicationElement)

adminManager.CommitChanges()

Function FindElement(collection, elementTagName, valuesToMatch)
   For i = 0 To CInt(collection.Count) - 1
      Set element = collection.Item(i)
      If element.Name = elementTagName Then
         matches = True
         For iVal = 0 To UBound(valuesToMatch) Step 2
            Set property = element.GetPropertyByName(valuesToMatch(iVal))
            value = property.Value
            If Not IsNull(value) Then
               value = CStr(value)
            End If
            If Not value = CStr(valuesToMatch(iVal + 1)) Then
               matches = False
               Exit For
            End If
         Next
         If matches Then
            Exit For
         End If
      End If
   Next
   If matches Then
      FindElement = i
   Else
      FindElement = -1
   End If
End Function