visual tutorial studio net mvc introducción example español code asp c# asp.net asp.net-core asp.net-core-mvc

c# - tutorial - Cómo obtener una ruta absoluta en ASP.Net Core de manera alternativa para Server.MapPath



asp.net mvc (3)

Inyecte IHostingEnvironment como una dependencia en la clase dependiente. El framework lo rellenará por ti.

public class HomeController : Controller { private IHostingEnvironment _hostingEnvironment; public HomeController(IHostingEnvironment environment) { _hostingEnvironment = environment; } [HttpGet] public IActionResult Get() { var path = Path.Combine(_hostingEnvironment.WebRootPath, "Sample.PNG"); return View(); } }

Podría ir un paso más allá y crear su propio servicio de proveedor de ruta.

public interface IPathProvider { string MapPath(string path); } public class PathProvider : IPathProvider { private IHostingEnvironment _hostingEnvironment; public PathProvider(IHostingEnvironment environment) { _hostingEnvironment = environment; } public string MapPath(string path) { var filePath = Path.Combine(_hostingEnvironment.WebRootPath, path); return filePath; } }

E inyecte IPathProvider en clases dependientes.

public class HomeController : Controller { private IPathProvider pathProvider; public HomeController(IPathProvider pathProvider) { this.pathProvider = pathProvider; } [HttpGet] public IActionResult Get() { var path = pathProvider.MapPath("Sample.PNG"); return View(); } }

Asegúrate de registrar el servicio con el contenedor DI.

services.AddSingleton<IPathProvider, PathProvider>();

Cómo obtener una ruta de acceso absoluta en la forma alternativa de la base de red ASP para Server.MapPath

He intentado usar IHostingEnvironment pero no da el resultado adecuado.

IHostingEnvironment env = new HostingEnvironment(); var str1 = env.ContentRootPath; // Null var str2 = env.WebRootPath; // Null, both doesn''t give any result

Tengo un archivo de imagen (Sample.PNG) en la carpeta wwwroot . Necesito obtener esta ruta absoluta.


Una mejor solución es usar el método IFileProvider.GetFileInfo() .

public IActionResult ResizeCat([FromServices] IFileProvider fileProvider) { // get absolute path (equivalent to MapPath) string absolutePath = fileProvider.GetFileInfo("/assets/images/cat.jpg").PhysicalPath; ... }

Debe registrar IFileProvider esta manera para poder acceder a él a través de DI :

// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddMvc(); var physicalProvider = _hostingEnvironment.ContentRootFileProvider; var embeddedProvider = new EmbeddedFileProvider(Assembly.GetEntryAssembly()); var compositeProvider = new CompositeFileProvider(physicalProvider, embeddedProvider); // choose one provider to use for the app and register it //services.AddSingleton<IFileProvider>(physicalProvider); //services.AddSingleton<IFileProvider>(embeddedProvider); services.AddSingleton<IFileProvider>(compositeProvider); }

Como puede ver, esta lógica (de donde proviene un archivo) puede ser bastante compleja, pero su código no se romperá si cambia.

Puede crear un IFileProvider personalizado con el new PhysicalFileProvider(root) si tiene alguna lógica especial. Tuve una situación en la que quiero cargar una imagen en middleware y cambiar su tamaño o recortarla. Pero es un proyecto Angular, por lo que la ruta es diferente para una aplicación implementada. El middleware que escribí toma IFileProvider de startup.cs y luego podría usar GetFileInfo() como lo hubiera hecho con MapPath en el pasado.


* Hack * No recomendado, pero para tu información, puedes obtener una ruta absoluta desde una ruta relativa con var abs = Path.GetFullPath("~/Content/Images/Sample.PNG").Replace("~//","");

Prefiere los enfoques de DI / Servicio anteriores, pero si está en una situación sin DI (por ejemplo, una clase instanciada con Activator ) esto funcionará.