.net - net - obtener url c#
ASP.NET MVC-Encuentre la ruta absoluta a la carpeta App_Data desde el controlador (7)
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:
¿Cuál es la forma correcta de encontrar la ruta absoluta a la carpeta App_Data desde un controlador en un proyecto MVC de ASP.NET? 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 debo determinar la ruta del archivo .xml en una aplicación MVC? ¿Global.asax y pegarlo una variable de nivel de aplicación?
Intento acostumbrarme a usar HostingEnvironment
lugar de Server
ya que también funciona dentro del contexto de los servicios 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 está disponible el HttpContext
. Tiene sentido: el directorio App_Data es una estructura de carpetas de proyectos web [1].
Si necesita la ruta a ~ / App_Data de una clase en la que no tiene acceso a HttpContext
, siempre puede inyectar una interfaz de proveedor utilizando su contenedor IoC:
public interface IAppDataPathProvider
{
string GetAppDataPath();
}
Implementalo usando tu HttpApplication
:
public class AppDataPathProvider : IAppDataPathProvider
{
public string GetAppDataPath()
{
return MyHttpApplication.GetAppDataPath();
}
}
Donde MyHttpApplication.GetAppDataPath
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 rutas con separadores de directorios al estilo "/". También maneja con seguridad la concatenación del camino. 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 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.
string filePath = HttpContext.Current.Server.MapPath("~/folderName/filename.extension");
O
string filePath = HttpContext.Server.MapPath("~/folderName/filename.extension");
string path = AppDomain.CurrentDomain.GetData("DataDirectory").ToString();
Esta es la forma más "correcta" de conseguirlo.