Get wwwroot folder path from ASP.NET 5 controller VS 2015

28,842

Solution 1

You will need to inject IWebHostEnvironment into your class to have access to the ApplicationBasePath property value: Read about Dependency Injection. After successfully injecting the dependency, the wwwroot path should be available to you. For example:

private readonly IWebHostEnvironment _appEnvironment;

public ProductsController(IWebHostEnvironment appEnvironment)
{
   _appEnvironment = appEnvironment;
}

Usage:

 [HttpGet]
 public IEnumerable<string> Get()
 {
    FolderScanner scanner = new FolderScanner(_appEnvironment.WebRootPath);
    return scanner.scan();
 }

Edit: IHostingEnvironment has been replaced by IWebHostEnvironment in later versions of asp.net.

Solution 2

I know this has already been answered, but it has given me different results depending on my hosting environment (IIS Express vs IIS). The following approach seems to work for all hosting environments nicely if you want to get your wwwroot path (see this GitHub issue).

For example

private readonly IHostingEnvironment _hostEnvironment;

public ProductsController(IHostingEnvironment hostEnvironment)
{
   _hostEnvironment = hostEnvironment;
}

[HttpGet]
public IEnumerable<string> Get()
{
   FolderScanner scanner = new FolderScanner(_hostEnvironment.WebRootPath);
   return scanner.scan();
}

Solution 3

For those who deploy to Azure and come into this error. What I did was a work around for it, I haven't tried to figure out why environment of Azure is different than local IIS. Here is my work around:

if (string.IsNullOrWhiteSpace(_environment.WebRootPath))
{
   _environment.WebRootPath = System.IO.Path.Combine(Directory.GetCurrentDirectory(), "wwwroot");
}

Of course you will need:

private IHostingEnvironment _environment;

public OnboardingController(IHostingEnvironment environment)
{
     _environment = environment;
}
Share:
28,842
Magician
Author by

Magician

Updated on September 06, 2021

Comments

  • Magician
    Magician over 2 years

    Sorry for a noob question, but it seems I can't get Server.MapPath from Controller. I need to output json file list from images folder at wwwroot. They are is at wwwroot/images. How can I get a reliable wwwroot path?

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;
    using Microsoft.AspNet.Mvc;
    using www.Classes;
    using System.Web;
    
    namespace www.Controllers
    {
        [Route("api/[controller]")]
        public class ProductsController : Controller
        {
            [HttpGet]
            public IEnumerable<string> Get()
            {
                FolderScanner scanner = new FolderScanner(Server.MapPath("/"));
                return scanner.scan();
            }
        }
    }
    

    Server.MapPath seems not available from System.Web namespace.

    Project is using ASP.NET 5 and dotNET 4.6 Framework