Solución:
ACTUALIZACIÓN: IHostingEnvironment está en desuso. Consulte la actualización a continuación.
En Asp.NET Core 2.2 y versiones anteriores, el entorno de alojamiento se ha abstraído mediante la interfaz, IHostingEnvironment
La propiedad ContentRootPath le dará acceso a la ruta absoluta a los archivos de contenido de la aplicación.
También puede usar la propiedad, WebRootPath si desea acceder a la ruta raíz de servicio web (carpeta www de forma predeterminada)
Puede inyectar esta dependencia en su controlador y acceder a él de la siguiente manera:
public class HomeController : Controller
{
private readonly IHostingEnvironment _hostingEnvironment;
public HomeController(IHostingEnvironment hostingEnvironment)
{
_hostingEnvironment = hostingEnvironment;
}
public ActionResult Index()
{
string webRootPath = _hostingEnvironment.WebRootPath;
string contentRootPath = _hostingEnvironment.ContentRootPath;
return Content(webRootPath + "n" + contentRootPath);
}
}
ACTUALIZAR
IHostingEnvironment se ha marcado como obsoleto con .NET Core 3.0 como lo señaló @ amir133. Debería utilizar IWebHostEnvironment en lugar de IHostingEnvironment. Consulte esa respuesta a continuación.
Microsoft ha segregado cuidadosamente las propiedades del entorno de host entre estas interfaces. Consulte la definición de interfaz a continuación:
namespace Microsoft.Extensions.Hosting
{
public interface IHostEnvironment
{
string EnvironmentName { get; set; }
string ApplicationName { get; set; }
string ContentRootPath { get; set; }
IFileProvider ContentRootFileProvider { get; set; }
}
}
namespace Microsoft.AspNetCore.Hosting
{
public interface IWebHostEnvironment : IHostEnvironment
{
string WebRootPath { get; set; }
IFileProvider WebRootFileProvider { get; set; }
}
}
.Net Core 3
Por ejemplo, quiero ubicar ~/wwwroot/CSS
public class YourController : Controller
{
private readonly IWebHostEnvironment _webHostEnvironment;
public YourController (IWebHostEnvironment webHostEnvironment)
{
_webHostEnvironment= webHostEnvironment;
}
public IActionResult Index()
{
string webRootPath = _webHostEnvironment.WebRootPath;
string contentRootPath = _webHostEnvironment.ContentRootPath;
string path ="";
path = Path.Combine(webRootPath , "CSS");
//or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
return View();
}
}
Algunos trucos
Además, si no tiene un controlador o servicio, siga la última parte y registre su clase como singleton. Luego, en Startup.ConfigureServices:
services.AddSingleton<your_class_Name>();
Finalmente, inyecte your_class_Name
donde lo necesite.
.Net Core 2
Por ejemplo, quiero ubicar ~/wwwroot/CSS
public class YourController : Controller
{
private readonly IHostingEnvironment _HostEnvironment;
public YourController (IHostingEnvironment HostEnvironment)
{
_HostEnvironment= HostEnvironment;
}
public ActionResult Index()
{
string webRootPath = _HostEnvironment.WebRootPath;
string contentRootPath = _HostEnvironment.ContentRootPath;
string path ="";
path = Path.Combine(webRootPath , "CSS");
//or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
return View();
}
}
Más detalles
Gracias a @Ashin pero IHostingEnvironment
está obsoleto en MVC core 3 !!
de acuerdo a esto :
Tipos obsoletos (advertencia):
Microsoft.Extensions.Hosting.IHostingEnvironment
Microsoft.AspNetCore.Hosting.IHostingEnvironment
Microsoft.Extensions.Hosting.IApplicationLifetime
Microsoft.AspNetCore.Hosting.IApplicationLifetime
Microsoft.Extensions.Hosting.EnvironmentName
Microsoft.AspNetCore.Hosting.EnvironmentName
Nuevos tipos:
Microsoft.Extensions.Hosting.IHostEnvironment
Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment
Microsoft.Extensions.Hosting.IHostApplicationLifetime
Microsoft.Extensions.Hosting.Environments
Entonces debes usar IWebHostEnvironment
en lugar de IHostingEnvironment
.
Sin embargo, la sugerencia de la respuesta aceptada es suficientemente buena en la mayoría de los escenarios, ya que depende de Inyección de dependencia – se limita a Controladores y Vistas: para tener una adecuada Server.MapPath
reemplazo al que se puede acceder desde clases auxiliares que no son singleton, podemos agregar las siguientes líneas de código al final del Configure()
método de la aplicación Startup.cs
expediente:
// setup app's root folders
AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath);
AppDomain.CurrentDomain.SetData("WebRootPath", env.WebRootPath);
De esta manera, podremos recuperarlos desde cualquier clase (incluidos, pero sin limitarnos a, Controladores y Vistas) de la siguiente manera:
var contentRootPath = (string)AppDomain.CurrentDomain.GetData("ContentRootPath");
var webRootPath = string)AppDomain.CurrentDomain.GetData("WebRootPath");
Esto se puede aprovechar aún más para crear un método auxiliar estático que nos permitirá tener la misma funcionalidad que el viejo Server.MapPath
:
public static class MyServer
{
public static string MapPath(string path)
{
return Path.Combine(
(string)AppDomain.CurrentDomain.GetData("ContentRootPath"),
path);
}
}
Que se puede utilizar de la siguiente manera:
var docPath = MyServer.MapPath("App_Data/docs");
Para obtener información adicional sobre este enfoque y un poco de antecedentes, eche un vistazo a esta publicación en mi blog.