Solución:
A partir de .Net Core v3.0, debería ser IWebHostEnvironment
para acceder al WebRootPath
que se ha movido a la interfaz del entorno web específico.
Inyectar IWebHostEnvironment
como una dependencia en la clase dependiente. El marco lo poblará por ti
public class HomeController : Controller {
private IWebHostEnvironment _hostEnvironment;
public HomeController(IWebHostEnvironment environment) {
_hostEnvironment = environment;
}
[HttpGet]
public IActionResult Get() {
string path = Path.Combine(_hostEnvironment.WebRootPath, "Sample.PNG");
return View();
}
}
Podría ir un paso más allá y crear su propia abstracción e implementación de servicios de proveedor de ruta.
public interface IPathProvider {
string MapPath(string path);
}
public class PathProvider : IPathProvider {
private IWebHostEnvironment _hostEnvironment;
public PathProvider(IWebHostEnvironment environment) {
_hostEnvironment = environment;
}
public string MapPath(string path) {
string filePath = Path.Combine(_hostEnvironment.WebRootPath, path);
return filePath;
}
}
E inyectar IPathProvider
en clases dependientes.
public class HomeController : Controller {
private IPathProvider pathProvider;
public HomeController(IPathProvider pathProvider) {
this.pathProvider = pathProvider;
}
[HttpGet]
public IActionResult Get() {
string path = pathProvider.MapPath("Sample.PNG");
return View();
}
}
Asegúrese de registrar el servicio con el contenedor DI
services.AddSingleton<IPathProvider, PathProvider>();
* Cortar a tajos *
No recomendado, pero para su información, puede obtener una ruta absoluta de una ruta relativa con
var abs = Path.GetFullPath("~/Content/Images/Sample.PNG").Replace("~\","");
Prefiera los enfoques DI / Service anteriores, pero si se encuentra en una situación sin DI (por ejemplo, una clase instanciada con Activator
) esto funcionará.
.NET Core 3.0
Var 1:
string path = System.IO.Directory.GetCurrentDirectory();
Var 2:
string path = AppDomain.CurrentDomain.BaseDirectory.Substring(0, AppDomain.CurrentDomain.BaseDirectory.IndexOf("\bin"));