ASP.NET MVC - Encuentra ruta absoluta a la carpeta App_Data del controlador
-
13-09-2019 - |
Pregunta
¿Cuál es la forma correcta para encontrar la ruta absoluta a la carpeta App_Data desde un controlador en un proyecto ASP.NET MVC? Me gustaría ser capaz de funcionar temporalmente con un archivo .xml y yo no quiero codificar el camino.
Esto no funciona:
[HandleError]
public class HomeController : Controller
{
public ActionResult Index()
{
string path = VirtualPathUtility.ToAbsolute("~/App_Data/somedata.xml");
//.... do whatever
return View();
}
}
Creo fuera del contexto web VirtualPathUtility.ToAbsolute () no funciona. string ruta regresa 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?
Solució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");
MSDN Referencia:
Otros consejos
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
Esta es probablemente una manera más "correcta" de hacer las cosas.
Intento conseguir en el hábito de usar HostingEnvironment
en lugar de Server
ya que funciona en el contexto de los servicios de WCF también.
HostingEnvironment.MapPath(@"~/App_Data/PriceModels.xml");
La forma más correcta es utilizar HttpContext.Current.Server.MapPath("~/App_Data");
. Esto significa que sólo se puede recuperar la ruta de un método en el que el HttpContext
está disponible. Tiene sentido: el directorio App_Data es una estructura de carpetas proyecto web [1]
Si usted necesita la ruta a ~ / App_Data de una clase en la que no tiene acceso a la HttpContext
siempre se puede inyectar una interfaz de proveedor de la utilización de su contenedor IoC:
public interface IAppDataPathProvider
{
string GetAppDataPath();
}
Implementar usando su HttpApplication
:
public class AppDataPathProvider : IAppDataPathProvider
{
public string GetAppDataPath()
{
return MyHttpApplication.GetAppDataPath();
}
}
Cuando MyHttpApplication.GetAppDataPath
se ve así:
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 caminos con locas "\" separadores de directorios estilo. También maneja con seguridad concatenación 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 se podría tratar "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 la ruta exactamente lo que se necesita por ahora