从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的答案,我会保持这种方式,因为他引导我这样做。 但我认为这是在整个项目中访问环境变量的更好方法