Saltar al contenido

¿Cuál es el equivalente de Server.MapPath en ASP.NET Core?

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *