180 votos

ASP.NET MVC - encontrar ruta absoluta a la carpeta App_Data del controlador

¿Cuál es la forma correcta de encontrar la ruta absoluta a la carpeta App_Data de un Controlador en un ASP.NET proyecto de MVC? Me gustaría ser capaz de trabajar temporalmente con un archivo .xml y no quiero especificar la ruta de acceso.

Esto no funciona:

[HandleError]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");

        //.... do whatever 

        return View();
    }

}

Creo que fuera de la web de contexto VirtualPathUtility.ToAbsolute() no funciona. cadena de ruta de acceso viene de vuelta "C:\App_Data\somedata.xml"

¿Dónde debería determinar la ruta de acceso del archivo .xml en una aplicación MVC? global.asax y pegarlo en una aplicación variable de nivel?

247voto

eu-ge-ne Puntos 17847

ASP.NET MVC1 -> MVC3

string path = HttpContext.Current.Server.MapPath("~/App_Data/somedata.xml");

ASP.NET MVC4

string path = HttpContext.Server.MapPath("~/App_Data/somedata.xml");


Referencia de MSDN:

Método HttpServerUtility.MapPath

179voto

jitbit Puntos 8072
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();

Esta es la forma más "correcta" de conseguirlo.

78voto

Simon_Weaver Puntos 31141

Trato de conseguir en el hábito de usar HostingEnvironment en vez de Server como funciona también en el contexto de los servicios de WCF. Es menos escribiendo también :-)

 HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");

5voto

Rudy Lattae Puntos 674

Phil Haak tiene un ejemplo que creo que es un poco más estable cuando se trata con trazados con la loca '\' estilo separadores de directorio. También maneja concatenación de camino. Se trata de forma gratuita en System.IO

var fileName = Path.GetFileName(file.FileName);
var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);

Sin embargo, también puede probar "AppDomain.CurrentDomain.BaseDirector" en lugar de "Server.MapPath".

5voto

Daniel Lidström Puntos 2970

El camino más correcto es utilizar HttpContext.Current.Server.MapPath("~/App_Data");. Esto significa que sólo se puede recuperar el camino de un método donde la HttpContext está disponible. Tiene sentido: el directorio App_Data es una web de estructura de carpetas del proyecto [1].

Si usted necesita la ruta ~/App_Data de una clase en la que no tienen acceso a las HttpContext siempre se puede inyectar una interfaz de proveedor mediante su contenedor de IoC:

public interface IAppDataPathProvider
{
    string GetAppDataPath();
}

Implementar el uso de su HttpApplication:

public class AppDataPathProvider : IAppDataPathProvider
{
    public string GetAppDataPath()
    {
        return MyHttpApplication.GetAppDataPath();
    }
}

Donde MyHttpApplication.GetAppDataPath parece:

public class MyHttpApplication : HttpApplication
{
    // of course you can fetch&store the value at Application_Start
    public static string GetAppDataPath()
    {
        return HttpContext.Current.Server.MapPath("~/App_Data");
    }
}

[1] http://msdn.microsoft.com/en-us/library/ex526337%28v=vs.100%29.aspx

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by: