【问题标题】:Get wwwroot folder path from ASP.NET 5 controller VS 2015从 ASP.NET 5 控制器 VS 2015 获取 wwwroot 文件夹路径
【发布时间】: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 框架的版本。

标签: c# asp.net rest asp.net-core asp.net-core-mvc


【解决方案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 指定依赖项。我指的是诸如配置之类的值和常量。
    猜你喜欢
    • 2021-06-27
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 2016-12-31
    • 2010-11-19
    • 2017-11-03
    相关资源
    最近更新 更多