2010-08-06 71 views
11

Cuando mi sitio ASP.NET utiliza documentos (por ejemplo, XML), que normalmente se carga el documento de la siguiente manera:Cómo utilizar Server.MapPath para obtener la ubicación fuera carpeta del sitio web en ASP.NET

Server.MapPath("~\Documents\MyDocument.xml") 

Sin embargo, Quisiera mover la carpeta Documentos fuera de la carpeta del sitio web para que ahora sea un hermano de la carpeta del sitio web. Esto hará que mantener los documentos sea considerablemente más fácil.

Sin embargo, volver a escribir el código de carga documento de la siguiente manera:

Server.MapPath("../../Documents/MyDocument.xml") 

resultados en una queja de ASP.NET que no puede 'por encima de la salida del directorio superior'.

¿Alguien puede sugerir cómo puedo especificar la ubicación de una carpeta fuera de la carpeta del sitio web? Realmente no quiero especificar rutas absolutas para las razones obvias de implementación.

Gracias

David

Respuesta

25

si sabe dónde es relativo a la raíz de su web, se puede utilizar Server.MapPath para obtener la ubicación física de la raíz de su web, y luego Path class 's método para obtener su documento camino.

En áspera código sin marcar algo como:

webRootPath = Server.MapPath("~") 
docPath = Path.GetFullPath(Path.Combine(rootPath, "../Documents/MyDocument.xml")) 

Lo siento si me dieron la sintaxis incorrecta, pero la clase Path debe ser lo que usted está después de jugar con los caminos reales FS en lugar de los trazados de texto web.

El motivo por el cual su método falló es que Server.MapPath toma una ubicación en su servidor web y la que usted entregó no es válida, ya que está "arriba" de la parte superior de la raíz de la jerarquía del servidor.

+0

Sí, por supuesto. Eso se parece a uno. – David

+1

Posiblemente aún mejor es agregar la carpeta Documentos como un directorio virtual al sitio web en IIS. – David

+0

Podrías hacer eso. Realmente depende si los usuarios necesitan acceso a estos documentos (o si lo desean). Si no es necesario que se descarguen nunca, entonces no es realmente necesario tenerlos como un directorio virtual. Por supuesto, puede protegerlos de otras formas (denegar permisos en el directorio, etc.) pero no tener una URL asociada siempre es la mejor manera de proteger.No sé realmente cuál es su uso, así que sin más idea de para qué sirve este directorio de Documentos. No me gustaría decir cuál es el mejor curso de acción (y de todos modos es una pregunta por separado). :) – Chris

0

Si desea especificar la ubicación en algún lugar de disco duro, entonces no es fácilmente disponible en entorno web. Si los archivos son de menor tamaño y cantidad, puede guardarlos dentro del directorio y señalarlos con ~/ruta hasta el directorio.

Pero en algunos casos solíamos hacer el objeto Solicitud. Para más información, visite este enlace

http://msdn.microsoft.com/en-us/library/5d5940ad.aspx

5
docPath = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"..\Documents\MyDocument.xml"); 

AppDomain.BaseDirectory retornos de ruta actual directorio de ensamblaje de aplicaciones web.

1

Si tiene que resolver la ruta en ambos casos, absoluta o relativa (incluso fuera de la carpeta raíz aplicación web) utilizar este:

public static class WebExtesions 
{ 
    public static string ResolveServerPath(this HttpContextBase context, string path) { 
     bool isAbsolute = System.IO.Path.IsPathRooted(path); 
     string root = context.Server.MapPath("~"); 
     string absolutePath = isAbsolute ? 
            path : 
            Path.GetFullPath(Path.Combine(root, path)); 
     return absolutePath; 
    } 
} 
+0

@cleftherus ¿Por qué necesitas 'this' en' este contexto de HttpContextBase'? – Chopo87

+1

@ Chopo87 En mi caso, estaba trabajando con la clase HttpContextWrapper (Asp.Net MVC) que es una subclase de HttpContextBase. Puede cambiar el método de extensión para tomar HttpContext en su lugar. – cleftheris

+0

@cleftherus Gracias, iré por el 'HttpContext' en mi caso – Chopo87

Cuestiones relacionadas