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

VAA*_*AAA 7 asp.net-core asp.net-core-3.0

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

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

在此处输入图片说明

这是我的旧代码:

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

我在 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);
        }
Run Code Online (Sandbox Code Playgroud)

但是上面的代码是针对一个存在于 web 项目中的 Controller 的。我的 Utility Projects 公共类不是控制器,而是一个静态类,因此我无法使用构造函数IWebHostEnvironment来自动注入。

任何线索如何才能获得路径,或者我可能需要手动注入 IWebHostEnvironment 但没有任何线索。

Chr*_*att 12

不要使用静态类。您可以保留与您的班级相似的内容,并将其注册为单身人士。

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");
            .....
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,在Startup.ConfigureServices

services.AddSingleton<Common>();
Run Code Online (Sandbox Code Playgroud)

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

更新:

为了使其工作,因为实用程序项目是引用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");
                .....
        }
    }
Run Code Online (Sandbox Code Playgroud)


Kar*_*ran 4

.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();
    }
}
Run Code Online (Sandbox Code Playgroud)