lunes, 31 de mayo de 2010

Crear un directorio virtual desde vb.net y asociar al sitio

Un directorio virtual es una ruta del servidor que no se encuentra en c:\inetpub\wwwroot (lugar habitual de las publicaciones). Igualmente, este puede ser accedido a traves del servidor web como si estuviera dentro de dicho lugar.

Cuando accedemos a IIS es necesario escribir una dirección de este tipo: http://localhost. De esta forma, estaríamos accediendo en C:\Inetpub\wwwroot, que es llamado directorio particular. Por el contrario, en los directorios virtuales se accede con http://localhost/directorio_virtual, lo cual no tiene que coincidir que el directorio se encuentre en la carpeta de publicación del disco (es decir, no tiene porque exitir en C:\Inetpub\wwwroot\directorio_virtual) pero si existirá en otra ubicación del disco.


Vamos a realizar esto por código VB.NET y a través de una carpeta existente(con el contenido que irá al sitio) , la copiaremos en la carpeta virtual y asociaremos con IIS.

Para esto crearemos un procedimiento recursivo de modo que si dentro de la carpeta con archivos existe otra carpeta y archivos, podamos tambien copiarlos.



Private Sub CopiarArchivos(ByVal Ip_FolderFrom As String, ByVal Ip_FolderTo As String)

Dim strArchivos As String() = Directory.GetFiles(Ip_FolderFrom)
Dim strCarpetas As String() = Directory.GetDirectories(Ip_FolderFrom)
Dim NombreArchivo As String = ""
Dim NombreCarpeta As String = ""

' Recorro todos los subdirectorios del directorio.
For Each SubDirectorio As String In strCarpetas
' Creo la carpeta en el subdirectorio
NombreCarpeta = Mid(SubDirectorio, SubDirectorio.LastIndexOf("\") + 2,SubDirectorio.Length)

Directory.CreateDirectory(Ip_FolderTo & NombreCarpeta)

' Llamo de nuevo al procedimiento para copiar los archivos.
Call CopiarArchivos(Ip_FolderFrom & "\" & NombreCarpeta,Ip_FolderTo & NombreCarpeta & "\")

Next

' Recorro todos los archivos del directorio
For Each Archivo As String In strArchivos

' Copio cada archivo en la carpeta destino (Ruta de instalacion ingresada)
NombreArchivo = Mid(Archivo, Archivo.LastIndexOf("\") + 2, Archivo.Length)
If Not File.Exists(Ip_FolderTo & NombreArchivo) Then File.Copy(Archivo, Ip_FolderTo & NombreArchivo, False)

Next

End Sub





Con esta función podremos copiar los archivos y carpetas del sitio en la ubicación que elijamos.

Luego con esto realizado podremos agregar la función que nos permita crear en IIS el sitio web apuntado al directorio virtual.


Espacio utilizado: System.DirectoryServices




Private Sub CreateVirtualDir(ByVal WebSite As String, ByVal AppName As String, ByVal Path As String)

Try

Dim IISSchema As New System.DirectoryServices.DirectoryEntry("IIS://" & WebSite & "/Schema/AppIsolated")
Dim CanCreate As Boolean = Not IISSchema.Properties("Syntax").Value.ToString.ToUpper() = "BOOLEAN"
IISSchema.Dispose()

If CanCreate Then
Dim PathCreated As Boolean

Try
Dim IISAdmin As New DirectoryEntry("IIS://" & WebSite & "/W3SVC/1/Root")

'Crear el sitio y asociar al directorio virtual
Dim VDir As DirectoryEntry = IISAdmin.Children.Add(AppName, "IIsWebVirtualDir")

VDir.Properties("Path").Item(0) = Path
VDir.Properties("AppFriendlyName").Item(0) = AppName
VDir.Properties("EnableDirBrowsing").Item(0) = False
VDir.Properties("AccessRead").Item(0) = True
VDir.Properties("AccessExecute").Item(0) = True
VDir.Properties("AccessWrite").Item(0) = False
VDir.Properties("AccessScript").Item(0) = True
VDir.Properties("AuthNTLM").Item(0) = True
VDir.Properties("EnableDefaultDoc").Item(0) = True
VDir.Properties("DefaultDoc").Item(0) = "index.aspx" ' Pagina por defecto.
VDir.Properties("AspEnableParentPaths").Item(0) = True

VDir.CommitChanges()

'the following are acceptable params
'INPROC = 0
'OUTPROC = 1
'POOLED = 2
VDir.Invoke("AppCreate", 1)

Me.Hide()
frmFinInstalacion.Show()

Catch Ex As Exception
If PathCreated Then
System.IO.Directory.Delete(Path)
End If
If Ex.GetHashCode.ToString() = "7588182" Then
Throw New Exception("El directorio virtual ya se encuentra creado.")
Else
Throw Ex
End If


End Try
End If
Catch ex As Exception
MsgBox(ex.Message)
End Try
End Sub






Espero que esto sea útil para más de uno ya que es un poco complicado hacer estas cosas sin un instalador y a veces necesario.

Saludos.

Mariano Llarin.-

No hay comentarios:

Publicar un comentario