从ASP.NET 5控制器VS 2015获取wwwroot文件夹路径

很抱歉有一个noob问题,但似乎我无法从Controller获取Server.MapPath。 我需要从wwwroot的images文件夹输出json文件列表。 他们是在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 Get() { FolderScanner scanner = new FolderScanner(Server.MapPath("/")); return scanner.scan(); } } } 

System.MapPath似乎在System.Web命名空间中不可用。

Project正在使用ASP.NET 5和dotNET 4.6 Framework

您需要将IHostingEnvironment注入到类中以访问ApplicationBasePath属性值:阅读有关dependency injection的信息 。 成功注入依赖项后,您应该可以使用wwwroot路径 。 例如:

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

用法:

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

我知道这已经得到了解答,但根据我的托管环境(IIS Express与IIS),它给了我不同的结果。 如果您想获得wwwroot路径,以下方法似乎适用于所有托管环境( 请参阅此GitHub问题 )。

例如

 private readonly IHostingEnvironment _hostEnvironment; public ProductsController(IHostingEnvironment hostEnvironment) { _hostEnvironment = hostEnvironment; } [HttpGet] public IEnumerable Get() { FolderScanner scanner = new FolderScanner(_hostEnvironment.WebRootPath); return scanner.scan(); } 

对于那些部署到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; } 

还有另一种方法可以从启动时实现这一点。 这个案例本身并不是确切的解决方案,但我修改它以满足我的需要。 我们需要一个单身人士。 这是一个带有环境注入的启动类。

 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。 但是出于我的目的,我需要像这样创建Environment类来轻松访问所有项目中的所有环境项。 这个单例将为配置,环境和许多其他东西提供数据。 但是对于这个线程,我只想放一个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; } } } } 

由于我接受了Oluwafemi的答案,我会保持这种方式,因为他引导我这样做。 但我认为这是在整个项目中访问环境变量的更好方法