2012-09-02 17 views
36

¿Cómo resuelvo las rutas relativas a un directorio raíz de la aplicación ASP.NET MVC 4? Es decir, quiero abrir archivos pertenecientes a la aplicación desde acciones del controlador, a los que se hace referencia como ~/Data/data.html. Estas rutas se suelen especificar en Web.config.¿Cómo puedo resolver una ruta relacionada con una raíz de la aplicación ASP.NET MVC 4?

EDIT:

Por 'resolver' me refiero a transformar una ruta relativa al directorio raíz de la aplicación de una ruta absoluta, .e.g. ~/Data/data.htmlC:\App\Data\Data.html.

+1

Así es como obtiene 'referencia' esos archivos desde la raíz ... –

+0

@Nate ¿Qué quiere decir con que ~ se expande automáticamente? – aknuds1

+0

[HttpContext.Current.Server.MapPath] (http://msdn.microsoft.com/en-us/library/system.web.httpserverutility.mappath.aspx)? – nemesv

Respuesta

68

Para obtener el uso ruta absoluta esto:

String path = HttpContext.Current.Server.MapPath("~/Data/data.html"); 

EDIT:

Para obtener el contexto del controlador de quitar .Current de la línea anterior. Al usar HttpContext por sí mismo es más fácil de probar porque está basado en el contexto del controlador, por lo tanto, más localizado.

Ahora me doy cuenta de que me gusta la forma en Server.MapPath obras (internamente llama finalmente HostingEnvironment.MapPath) Así que ahora recomiendo usar siempre HostingEnvironment.MapPath porque su estática y no depende del contexto, a menos, por supuesto, usted quiere que ...

+0

Solo quiero leer el archivo en el servidor, no debe devolverse al cliente. – aknuds1

+0

Esta es la manera de hacerlo. Además, si necesita usar esto estáticamente, vea esta pregunta: http: // stackoverflow.com/questions/3795986/using-server-mappath-inside-a-static-field-in-asp-net-mvc –

+0

Estoy en un método no estático de una subclase System.Web.Mvc.Controller, pero ' HttpContext' no tiene la propiedad 'Actual'. ¿Que pasa? – aknuds1

4

En la acción que se puede llamar:

this.Request.PhysicalPath 

que devuelve la ruta física en referencia al controlador actual. Si sólo necesita la llamada ruta de raíz:

this.Request.PhysicalApplicationPath 
10

Justo utilice el siguiente

Server.MapPath("~/Data/data.html") 
+0

Simple y correcto. Gracias. – CodeBreaker

47

encuentro este código útil cuando necesito un camino fuera de un controlador, por ejemplo, cuando estoy en la inicialización de los componentes Global.asax.cs:

HostingEnvironment.MapPath("~/Data/data.html") 
+1

HostingEnvironment.MapPath es una mejor respuesta. Cuando ejecuta el código fuera del contexto de una solicitud http, HttpContext.Current es nulo y su código falla. HostingEnvironment.MapPath siempre funciona. – JDC

+0

También vale la pena mencionar que "HostingEnvironment.MapPath" se puede personalizar si tiene su propia implementación de un proveedor de ruta virtual. Funciona en cualquier entorno "alojado" (servicio de Windows o alojado iis) https://support.microsoft.com/en-us/kb/910441 – Rikki

Cuestiones relacionadas