从 ASP.NET 5 控制器 VS 2015 获取 wwwroot 文件夹路径
Posted
技术标签:
【中文标题】从 ASP.NET 5 控制器 VS 2015 获取 wwwroot 文件夹路径【英文标题】:Get wwwroot folder path from ASP.NET 5 controller VS 2015 【发布时间】:2015-08-25 07:50:32 【问题描述】:很抱歉提出一个菜鸟问题,但我似乎无法从 Controller 获取 Server.MapPath。我需要从 wwwroot 的图像文件夹中输出 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<string> Get()
FolderScanner scanner = new FolderScanner(Server.MapPath("/"));
return scanner.scan();
Server.MapPath 似乎在 System.Web 命名空间中不可用。
项目正在使用 ASP.NET 5 和 dotNET 4.6 框架
【问题讨论】:
请更新您正在使用的 .Net 框架的版本。 【参考方案1】:您需要将IWebHostEnvironment
注入到您的类中才能访问ApplicationBasePath
属性值:了解Dependency Injection。成功注入依赖后,wwwroot 路径 应该可供您使用。例如:
private readonly IWebHostEnvironment _appEnvironment;
public ProductsController(IWebHostEnvironment appEnvironment)
_appEnvironment = appEnvironment;
用法:
[HttpGet]
public IEnumerable<string> Get()
FolderScanner scanner = new FolderScanner(_appEnvironment.WebRootPath);
return scanner.scan();
编辑: IHostingEnvironment
在 asp.net 的更高版本中已替换为 IWebHostEnvironment
。
【讨论】:
严重代码说明项目文件行错误 CS0234 类型或命名空间名称“Hosting”在命名空间“System.Web”中不存在(您是否缺少程序集引用?) www.DNX 4.5.1 D:\Innoware\Projects\VS\Projects\www\src\www\Controllers\ProductsController.cs 4 不确定。我使用 VS2015 上的默认值启动此解决方案。单页应用程序,框架 4.6。我没有修改任何东西【参考方案2】:我知道这已经得到解答,但根据我的托管环境(IIS Express 与 IIS),它给了我不同的结果。如果您想获取 wwwroot 路径 (see this GitHub issue),以下方法似乎适用于所有托管环境。
例如
private readonly IHostingEnvironment _hostEnvironment;
public ProductsController(IHostingEnvironment hostEnvironment)
_hostEnvironment = hostEnvironment;
[HttpGet]
public IEnumerable<string> Get()
FolderScanner scanner = new FolderScanner(_hostEnvironment.WebRootPath);
return scanner.scan();
【讨论】:
我看到了与评论者相同的问题,之前的答案是根据 IIS Express 和 IIS 给出不同的结果。这个一直有效! 从 .Net Core 1.0 开始,这是正确的做法。【参考方案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。但就我的目的而言,我需要制作这样的 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 的回答,所以我会保持这种状态,因为他引导我这样做。但我认为这是在整个项目中访问环境变量的更好方法
【讨论】:
我不喜欢它。我不喜欢静态单例。这违反了 IoC 原则。 IoC 指定依赖项。我指的是诸如配置之类的值和常量。以上是关于从 ASP.NET 5 控制器 VS 2015 获取 wwwroot 文件夹路径的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC 5 解决方案在 VS2013 中有效,但在 VS2015 中无效
Visual Studio 2015和ASP.NET 5中可用的前端开发工具集