从 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 5 项目托管

ASP.NET MVC 5 解决方案在 VS2013 中有效,但在 VS2015 中无效

在VS2015中缺少ASP.NET Web应用程序模版

Visual Studio 2015和ASP.NET 5中可用的前端开发工具集

vs2005新建项目中没有ASP.NET WEB应用程序,如何建立?

配置 ASP.NET Core 应用程序的正确顺序是啥?