【问题标题】:ASP.NET Core 3.0 HttpContext.Current.Server.MapPathASP.NET Core 3.0 HttpContext.Current.Server.MapPath
【发布时间】:2020-01-14 18:25:16
【问题描述】:

我将一个经典的 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 项目中的控制器。我的实用程序项目公共类不是控制器,而是一个静态类,所以我不能使用构造函数来自动注入 IWebHostEnvironment

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

【问题讨论】:

    标签: asp.net-core asp.net-core-3.0


    【解决方案1】:

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

    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,而不是仅仅静态引用类。这就是 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");
                    .....
            }
        }
    

    【讨论】:

    • 非常感谢,但如果我想在我的静态类中实例化 IWebHostEnvironment 有没有办法?像 IWebHostEnvironment env = new something() 吗?欣赏它
    • @VAAA 如果你做了 HostingEnvironment env = new HostingEnvironment() 怎么办?这个类和 IWebHostEnvironment 都实现了 IHostEnvironment
    • 没有。这是不可能的。这就是我建议这种方法的原因。静力学在这里不起作用,所以你只需要克服它。
    • @ChrisPratt 非常感谢,你知道我必须引用什么 nuget 包来引用我的实用程序项目才能获得 IWebHostEnvironment 吗?
    • 我已经尝试安装不同的 nuget 包,但没有人解决 IWebHostEnvironment。当右键单击“快速操作和重构”时,它不会给我任何安装建议或其他东西:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 2020-03-23
    • 1970-01-01
    • 2020-06-22
    • 2019-09-29
    • 2020-03-16
    • 2020-05-01
    相关资源
    最近更新 更多