ASP.NET MVC: busque la ruta absoluta a la carpeta App_Data desde el controlador

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

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 del contexto web VirtualPathUtility.ToAbsolute () no funciona. la ruta de la cadena vuelve como “C: \ App_Data \ somedata.xml”

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

ASP.NET MVC1 -> MVC3

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

ASP.NET MVC4

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

Referencia de MSDN:

Método HttpServerUtility.MapPath

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

Esta es la forma más “correcta” de obtenerlo.

Intento adquirir el hábito de usar HostingEnvironment lugar de Server ya que también funciona en el contexto de los servicios de WCF.

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

La forma más correcta es usar HttpContext.Current.Server.MapPath("~/App_Data"); . Esto significa que solo puede recuperar la ruta desde un método donde HttpContext está disponible. Tiene sentido: el directorio App_Data es una estructura de carpeta de proyecto web [1].

Si necesita la ruta a ~ / App_Data de una clase en la que no tiene acceso al HttpContext , siempre puede insertar una interfaz de proveedor utilizando su contenedor IoC:

 public interface IAppDataPathProvider { string GetAppDataPath(); } 

HttpApplication usando su aplicación HttpApplication :

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

Donde se ve MyHttpApplication.GetAppDataPath :

 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

Phil Haak tiene un ejemplo que creo que es un poco más estable cuando se trata de rutas con locas “y” separadores de directorios de estilo. También maneja con seguridad la concatenación de rutas. Viene gratis 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”.

 string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension"); 

O

 string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension"); 
 string Index = i; string FileName = "Mutton" + Index + ".xml"; XmlDocument xmlDoc = new XmlDocument(); var path = Path.Combine(Server.MapPath("~/Content/FilesXML"), FileName); xmlDoc.Load(path); // Can use xmlDoc.LoadXml(YourString); 

esta es la mejor solución para obtener el camino que es exactamente necesario por ahora