Получить путь к папке 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;
}
}
}
}
Как я принял ответы Олувафеми, я сохраню это, потому что он привел меня к этому. Но я думаю, что это лучший способ доступа к переменным среды во всем проекте.