Получить путь к папке wwwroot с контроллера ASP.NET 5 VS 2015

Извините за вопрос noob, но, похоже, я не могу получить Server.MapPath из Controller. Мне нужно вывести список файлов json из папки изображений на wwwroot. Они находятся на wwwroot/images. Как я могу получить надежный путь wwwroot?

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 кажется недоступным из пространства имен System.Web.

Проект использует ASP.NET 5 и dotNET 4.6 Framework

Ответ 1

Вам понадобится ввести IHostingEnvironment в свой класс, чтобы получить доступ к значению свойства ApplicationBasePath: Прочитать о Injection of Dependency. После успешной инъекции зависимости wwwroot path должен быть доступен вам. Например:

private readonly IHostingEnvironment _appEnvironment;

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

Применение:

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

Ответ 2

Я знаю, что на это уже был дан ответ, но он дал мне разные результаты в зависимости от моей среды размещения (IIS Express vs IIS). Похоже, что следующий подход подходит для всех хостинговых сред, если вы хотите, чтобы ваш путь wwwroot (рассматривался в этой проблеме GitHub).

Например

private readonly IHostingEnvironment _hostEnvironment;

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

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

Ответ 3

Для тех, кто развертывает Azure и попадает в эту ошибку. То, что я сделал, это работа для него, я не пытался понять, почему среда Azure отличается от локальной IIS. Вот моя работа:

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

Конечно, вам понадобится:

private IHostingEnvironment _environment;

public OnboardingController(IHostingEnvironment environment)
{
     _environment = environment;
}

Ответ 4

Существует другой способ реализовать это право от запуска. Это не точное решение для этого случая само по себе, но я изменил его в соответствии с моими потребностями. Для этого нам нужен синглтон. Это класс запуска с внедрением среды.

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

Переменные среды, которые я искал, есть, IHOstingEnvironment. Но для моей цели мне нужно сделать класс среды таким образом, чтобы легко получить доступ ко всем элементам среды из всего проекта. Этот синглтон предоставит данные для конфигурации, среды и многих других. Но для этого потока я бы просто поместил одно свойство rootPath.

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

Как я принял ответы Олувафеми, я сохраню это, потому что он привел меня к этому. Но я думаю, что это лучший способ доступа к переменным среды во всем проекте.