ASP.NET 核心 3.0 HttpContext.Current.Server.MapPath

ASP.NET Core 3.0 HttpContext.Current.Server.MapPath

我正在将一个 classic C# MVC 项目迁移到 .NET Core,我有一个实用程序项目,我需要在其中访问 App_Data 文件夹。

我已经在这个新项目中在 wwwroot 之外创建了我的 App_Data 文件夹,但我需要从这个实用程序项目中获取对它的引用。

这是我的旧代码:

 public static class Common
    {
      private static void DeleteTestFiles()
            {
                var path = HttpContext.Current.Server.MapPath("~/App_Data/Files");
                .....
    }
}

我读到在 3.0 中有一种方法可以做到这一点,这里是示例:

 private readonly IWebHostEnvironment _hostingEnvironment;

        public HomeController(IWebHostEnvironment hostingEnvironment)
        {
            _hostingEnvironment = hostingEnvironment;
        }

        public ActionResult Index()
        {
            string webRootPath = _hostingEnvironment.WebRootPath;
            string contentRootPath = _hostingEnvironment.ContentRootPath;

            return Content(webRootPath + "\n" + contentRootPath);
        }

但上面的代码适用于 Web 项目中的控制器。我的 Utility Projects common class 不是 Controller,而是静态的 class,因此我无法使用构造函数来自动注入 IWebHostEnvironment

Any clue how can I do get the path or maybe I need to manually inject IWebHostEnvironment but don't have a clue.

不要使用静态 class。您可以保留与您的 class 类似的内容,并将其注册为单例。

public class Common
{
    private readonly IWebHostEnvironment _env;

    public Common(IWebHostEnvironment env)
    {
        _env = env;
    }

    private void DeleteTestFiles()
    {
            var path = Path.Combine(_env.ContentRootPath, "App_Data/Files");
            .....
    }
}

然后,在Startup.ConfigureServices

services.AddSingleton<Common>();

最后,在需要的地方注入 Common,而不是仅仅静态引用 class。这就是 DI 中的工作方式,静态是不行的。

更新:

为了使其正常工作,因为 Utility 项目引用的是 Microsoft.NETCore.App 而不是 Microsoft.AspNetCore.App 框架,所以您必须使用 IHostEnvironment 而不是 IWebHostEnvironment

IWebHostEnvironment 实际上实现了 IHostEnvironment 接口。

测试了吗,一切正常!我可以得到 ContentRootPath.

public class Common
    {
        private readonly IHostEnvironment _env;

        public Common(IHostEnvironment env)
        {
            _env = env;
        }

        private void DeleteTestFiles()
        {
                var path = Path.Combine(_env.ContentRootPath, "App_Data/Files");
                .....
        }
    }

.Net 6(.NetCore 3 及以上) 例如我想找到 ~/wwwroot/CSS

public class YourController : Controller
{
    private readonly IWebHostEnvironment _webHostEnvironment;

    public YourController (IWebHostEnvironment webHostEnvironment)
    {
        _webHostEnvironment= webHostEnvironment;
    }

    public IActionResult Index()
    {
        string webRootPath = _webHostEnvironment.WebRootPath;
        string contentRootPath = _webHostEnvironment.ContentRootPath;

        string path ="";
        path = Path.Combine(webRootPath , "CSS");
        //or path = Path.Combine(contentRootPath , "wwwroot" ,"CSS" );
        return View();
    }
}