Tengo esta línea en un código que quiero copiar en mi controlador, pero el compilador se queja de que
El nombre 'Servidor' no existe en el contexto actual
var UploadPath = Server.MapPath("~/App_Data/uploads")¿Cómo puedo lograr el equivalente en ASP.NET Core?
ACTUALIZACIÓN: IHostingEnvironment está en desuso. Ver 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 del servicio web (carpeta www de forma predeterminada)
Puede inyectar esta dependencia en su controlador y acceder a ella 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); } }ACTUALIZACIÓN - .NET CORE 3.0 y superior
IHostingEnvironment se ha marcado como obsoleto con .NET Core 3.0 como lo señaló @ amir133 . Debería usar IWebHostEnvironment en lugar de IHostingEnvironment . Por favor, consulte esa respuesta a continuación .
Microsoft ha segregado cuidadosamente las propiedades del entorno del host entre estas interfaces. Consulte la definición de la 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; } } } 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(); } }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.
Por ejemplo, quiero ubicar ~/wwwroot/CSS
public class YourController : Controller { private readonly IHostingEnvironment _HostEnvironment; //diference is here : IHostingEnvironment vs I*Web*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(); } } ¡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.EnvironmentNameNuevos tipos:
Microsoft.Extensions.Hosting.IHostEnvironment Microsoft.AspNetCore.Hosting.IWebHostEnvironment : IHostEnvironment Microsoft.Extensions.Hosting.IHostApplicationLifetime Microsoft.Extensions.Hosting.Environments Por lo tanto, debe usar IWebHostEnvironment en lugar de IHostingEnvironment .
utilice, por ejemplo: var fullPath = Path.Combine(Directory.GetCurrentDirectory(), "appsettings.json");
La sugerencia de la respuesta aceptada es lo suficientemente buena en la mayoría de los escenarios, sin embargo, dado que depende de la inyección de dependencia , se limita a los controladores y las vistas: para tener un reemplazo Server.MapPath adecuado al que se pueda acceder desde clases auxiliares que no sean singleton, podemos agregar las siguientes líneas de código al final del método Configure() del archivo Startup.cs de la aplicación:
// setup app's root folders AppDomain.CurrentDomain.SetData("ContentRootPath", env.ContentRootPath); AppDomain.CurrentDomain.SetData("WebRootPath", env.WebRootPath);De esta manera, podremos recuperarlos desde dentro de cualquier clase (incluidos, entre otros, Controladores y Vistas) de la siguiente manera:
var contentRootPath = (string)AppDomain.CurrentDomain.GetData("ContentRootPath"); var webRootPath = (string)AppDomain.CurrentDomain.GetData("WebRootPath"); Esto se puede explotar 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 historia, echa un vistazo a esta publicación en mi blog.