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

后端 未结 4 1747
名媛妹妹
名媛妹妹 2020-12-10 02:10

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/im

相关标签:
4条回答
  • 2020-12-10 02:46

    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();
    }
    
    0 讨论(0)
  • 2020-12-10 02:48

    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;
    }
    
    0 讨论(0)
  • 2020-12-10 02:53

    There is another way to implement this right from startup. It is not exact solution to this case per se, but I modified it to suit my need. We need a singleton for this. This is a startup class with environment injection.

    namespace www
    {
        public class Startup
        {
            private IHostingEnvironment _env;
    
            public Startup(IHostingEnvironment env)
            {
                _env = env;
                Environment.rootPath = env.WebRootPath;
            }
    
            public void ConfigureServices(IServiceCollection services)
            {
                services.AddMvc();
            }
    
            public void Configure(IApplicationBuilder app, IHostingEnvironment env)
            {
                app.UseStaticFiles();
                app.UseMvc();
            }
        }
    }
    

    The environment variables I was looking for is there, IHOstingEnvironment. But for my purpose, I need to make Environment class like this to easily access all environment items from all project. This singleton will provide data to configuration, environment, and many other thing. But for this thread, I would just put one rootPath property.

    namespace www.Utilities
    {
        public class Environment
        {
            private static Environment instance;
            private static String _rootPath;
    
            private Environment() { }
    
            public static Environment Instance
            {
                get
                {
                    if (instance == null)
                    {
                        instance = new Environment();
                    }
                    return instance;
                }
            }
    
            public static string rootPath
            {
                set
                {
                    _rootPath = value;
                }
                get
                {
                    return _rootPath;
                }
            }    
        }
    }
    

    As I have accepted Oluwafemi's answers, I'll keep it that way, since he led me to this. But I think this is the better way to access environment variables throughout the project

    0 讨论(0)
  • 2020-12-10 03:06

    You will need to inject IHostingEnvironment 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 IHostingEnvironment _appEnvironment;
    
    public ProductsController(IHostingEnvironment appEnvironment)
    {
       _appEnvironment = appEnvironment;
    }
    

    Usage:

     [HttpGet]
     public IEnumerable<string> Get()
     {
        FolderScanner scanner = new FolderScanner(_appEnvironment.ApplicationBasePath);
        return scanner.scan();
     }
    
    0 讨论(0)
提交回复
热议问题