ASP .NET Core - Usando WebRootPath para obter o caminho absoluto


Hoje veremos como obter o caminho absoluto usando a propriedade WebRootPath.

A propriedade WebRootPath fornece o caminho da pasta wwwroot do projeto. Você pode usar essa propriedade dentro de um Controller para obter o caminho absoluto dos arquivos mantidos na pasta de conteúdo estático.

Para fazer isso, você só tinha que definir o namespace Microsoft.AspNetCore.Hosting e incluir uma instância de IHostingEnvironment como parâmetro para o construtor do Controller.

O recurso Injeção de Dependência do ASP.NET Core MVC vai injetar o serviço de IHostingEnvironment ao construtor. Em seguida, você pode usar a propriedade WebRootPath para encontrar o caminho absoluto, como mostrado no código abaixo.

public class HomeController : Controller
{
    private IHostingEnvironment hostingEnvironment;  
    public HomeController(IHostingEnvironment environment)
    {
        hostingEnvironment = environment;
    }  
    public ActionResult Index()
    {
        string absolutePath = Path.Combine(hostingEnvironment.WebRootPath, "Arquivo1.jpg"); 
        return View();
    }   
}

Mas se você estiver usando a ASP .NET Core 3.1 vai obter a seguinte mensagem de alerta:

A mensagem avisa que IHostingEnvironment esta obsoleto e que você tem que usar o IWebHostEnvironment.

Sem problemas, basta então incluir o namespace Microsoft.AspNetCore.Hosting e injetar a instãncia de IWebHostEnvironment.

Abaixo temos um exemplo onde obtemos o caminho absoluto de wwwroot e a seguir montamos um caminho que contém a pasta videos onde a seguir obtemos todos os arquivos com extensão .mp4 :

    public class HomeController : Controller
    {
        private readonly IWebHostEnvironment _appEnvironment;
        public HomeController(IWebHostEnvironment env)
        {
            _appEnvironment = env;
        }
        public IActionResult Video()
        {
            string pasta = "videos";
            string caminho_WebRoot = _appEnvironment.WebRootPath;
            string caminhoVideos = Path.Combine(caminho_WebRoot, pasta);
            string[] arquivosVideos = Directory.GetFiles(caminhoVideos, "*.mp4")
                                                     .Select(Path.GetFileName)
                                                     .ToArray();
            List<string> listaVideos = new List<string>(arquivosVideos);
            var videoVM = new VideoViewModel();
            videoVM.Videos = new SelectList(listaVideos);
            return View(videoVM);
        }

Se levarmos em conta que a interface IHostingEnvironment é uma das interfaces mais irritantes do .NET Core 2.x, porque existe em dois namespaces diferentes, Microsoft.AspNetCore.Hosting e Microsoft.Extensions.Hosting sendo que estes são ligeiramente diferentes e são incompatíveis, o ajuste é bem-vindo.

Além a interface IWebHostEnvironment também foi introduzida a interface IHostEnvironment que estão em espaços para nome separados, têm nomes diferentes e um herda do outro!

Veja a hierarquia:

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; }
    }
}

Assim (IHostEnvironment) agora também funcionará com a versão da web (IWebHostEnvironment), e,  debaixo dos panos, as implementações do IHostEnvironment e IWebHostEnvironment ainda são as mesmas - elas apenas implementam as novas interfaces, além das antigas.

"Se alguém ouvir as minhas palavras e não as guardar, eu não o julgo; porque eu não vim para julgar o mundo, e sim para salvá-lo.
Quem me rejeita e não recebe as minhas palavras tem quem o julgue; a própria palavra que tenho proferido, essa o julgará no último dia."
João 12:47,48

Referências:


José Carlos Macoratti